<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>AdminServlet xref</title>
<link type="text/css" rel="stylesheet" href="../../../../stylesheet.css" />
</head>
<body>
<pre>

<a name="1" href="#1">1</a>   <strong class="jxr_keyword">package</strong> org.methodize.nntprss.admin;
<a name="2" href="#2">2</a>   
<a name="3" href="#3">3</a>   <em class="jxr_comment">/*<em class="jxr_comment"> -----------------------------------------------------------</em></em>
<a name="4" href="#4">4</a>   <em class="jxr_comment"> * nntp//rss - a bridge between the RSS world and NNTP clients</em>
<a name="5" href="#5">5</a>   <em class="jxr_comment"> * Copyright (c) 2002-2007 Jason Brome.  All Rights Reserved.</em>
<a name="6" href="#6">6</a>   <em class="jxr_comment"> *</em>
<a name="7" href="#7">7</a>   <em class="jxr_comment"> * email: nntprss@methodize.org</em>
<a name="8" href="#8">8</a>   <em class="jxr_comment"> * mail:  Jason Brome</em>
<a name="9" href="#9">9</a>   <em class="jxr_comment"> *        PO Box 222-WOB</em>
<a name="10" href="#10">10</a>  <em class="jxr_comment"> *        West Orange</em>
<a name="11" href="#11">11</a>  <em class="jxr_comment"> *        NJ 07052-0222</em>
<a name="12" href="#12">12</a>  <em class="jxr_comment"> * </em>
<a name="13" href="#13">13</a>  <em class="jxr_comment"> * This file is part of nntp//rss</em>
<a name="14" href="#14">14</a>  <em class="jxr_comment"> * </em>
<a name="15" href="#15">15</a>  <em class="jxr_comment"> * nntp//rss is free software; you can redistribute it </em>
<a name="16" href="#16">16</a>  <em class="jxr_comment"> * and/or modify it under the terms of the GNU General </em>
<a name="17" href="#17">17</a>  <em class="jxr_comment"> * Public License as published by the Free Software Foundation; </em>
<a name="18" href="#18">18</a>  <em class="jxr_comment"> * either version 2 of the License, or (at your option) any </em>
<a name="19" href="#19">19</a>  <em class="jxr_comment"> * later version.</em>
<a name="20" href="#20">20</a>  <em class="jxr_comment"> *</em>
<a name="21" href="#21">21</a>  <em class="jxr_comment"> * This program is distributed in the hope that it will be </em>
<a name="22" href="#22">22</a>  <em class="jxr_comment"> * useful, but WITHOUT ANY WARRANTY; without even the implied </em>
<a name="23" href="#23">23</a>  <em class="jxr_comment"> * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR </em>
<a name="24" href="#24">24</a>  <em class="jxr_comment"> * PURPOSE.  See the GNU General Public License for more </em>
<a name="25" href="#25">25</a>  <em class="jxr_comment"> * details.</em>
<a name="26" href="#26">26</a>  <em class="jxr_comment"> *</em>
<a name="27" href="#27">27</a>  <em class="jxr_comment"> * You should have received a copy of the GNU General Public </em>
<a name="28" href="#28">28</a>  <em class="jxr_comment"> * License along with this program; if not, write to the </em>
<a name="29" href="#29">29</a>  <em class="jxr_comment"> * Free Software Foundation, Inc., 59 Temple Place, Suite 330, </em>
<a name="30" href="#30">30</a>  <em class="jxr_comment"> * Boston, MA  02111-1307  USA</em>
<a name="31" href="#31">31</a>  <em class="jxr_comment"> * ----------------------------------------------------- */</em>
<a name="32" href="#32">32</a>  
<a name="33" href="#33">33</a>  <strong class="jxr_keyword">import</strong> java.io.IOException;
<a name="34" href="#34">34</a>  <strong class="jxr_keyword">import</strong> java.io.PrintWriter;
<a name="35" href="#35">35</a>  <strong class="jxr_keyword">import</strong> java.io.Writer;
<a name="36" href="#36">36</a>  <strong class="jxr_keyword">import</strong> java.net.MalformedURLException;
<a name="37" href="#37">37</a>  <strong class="jxr_keyword">import</strong> java.net.URL;
<a name="38" href="#38">38</a>  <strong class="jxr_keyword">import</strong> java.net.URLEncoder;
<a name="39" href="#39">39</a>  <strong class="jxr_keyword">import</strong> java.text.DateFormat;
<a name="40" href="#40">40</a>  <strong class="jxr_keyword">import</strong> java.util.*;
<a name="41" href="#41">41</a>  
<a name="42" href="#42">42</a>  <strong class="jxr_keyword">import</strong> javax.mail.internet.MailDateFormat;
<a name="43" href="#43">43</a>  <strong class="jxr_keyword">import</strong> javax.servlet.ServletException;
<a name="44" href="#44">44</a>  <strong class="jxr_keyword">import</strong> javax.servlet.http.HttpServlet;
<a name="45" href="#45">45</a>  <strong class="jxr_keyword">import</strong> javax.servlet.http.HttpServletRequest;
<a name="46" href="#46">46</a>  <strong class="jxr_keyword">import</strong> javax.servlet.http.HttpServletResponse;
<a name="47" href="#47">47</a>  <strong class="jxr_keyword">import</strong> javax.xml.parsers.DocumentBuilder;
<a name="48" href="#48">48</a>  <strong class="jxr_keyword">import</strong> javax.xml.parsers.ParserConfigurationException;
<a name="49" href="#49">49</a>  
<a name="50" href="#50">50</a>  <strong class="jxr_keyword">import</strong> org.apache.commons.httpclient.HttpStatus;
<a name="51" href="#51">51</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.feed.Category;
<a name="52" href="#52">52</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.feed.Channel;
<a name="53" href="#53">53</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.feed.ChannelManager;
<a name="54" href="#54">54</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.feed.publish.*;
<a name="55" href="#55">55</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.nntp.NNTPServer;
<a name="56" href="#56">56</a>  <strong class="jxr_keyword">import</strong> org.methodize.nntprss.util.*;
<a name="57" href="#57">57</a>  <strong class="jxr_keyword">import</strong> org.mortbay.servlet.MultiPartRequest;
<a name="58" href="#58">58</a>  <strong class="jxr_keyword">import</strong> org.w3c.dom.*;
<a name="59" href="#59">59</a>  <strong class="jxr_keyword">import</strong> org.xml.sax.SAXException;
<a name="60" href="#60">60</a>  
<a name="61" href="#61">61</a>  <em class="jxr_javadoccomment">/**</em>
<a name="62" href="#62">62</a>  <em class="jxr_javadoccomment"> * @author Jason Brome &lt;jason@methodize.org&gt;</em>
<a name="63" href="#63">63</a>  <em class="jxr_javadoccomment"> * @version $Id: AdminServlet.java,v 1.21 2007/12/17 04:06:54 jasonbrome Exp $</em>
<a name="64" href="#64">64</a>  <em class="jxr_javadoccomment"> * </em>
<a name="65" href="#65">65</a>  <em class="jxr_javadoccomment"> * Web Administration interface for nntp//rss</em>
<a name="66" href="#66">66</a>  <em class="jxr_javadoccomment"> * </em>
<a name="67" href="#67">67</a>  <em class="jxr_javadoccomment"> * In its current implementation, it's a rather inelegant</em>
<a name="68" href="#68">68</a>  <em class="jxr_javadoccomment"> * bundle of admin + presentation logic.  When I find the</em>
<a name="69" href="#69">69</a>  <em class="jxr_javadoccomment"> * right lightweight template-driven solution, I'll switch</em>
<a name="70" href="#70">70</a>  <em class="jxr_javadoccomment"> * over to that...</em>
<a name="71" href="#71">71</a>  <em class="jxr_javadoccomment"> * </em>
<a name="72" href="#72">72</a>  <em class="jxr_javadoccomment"> */</em>
<a name="73" href="#73">73</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../org/methodize/nntprss/admin/AdminServlet.html">AdminServlet</a> <strong class="jxr_keyword">extends</strong> HttpServlet {
<a name="74" href="#74">74</a>  
<a name="75" href="#75">75</a>  	<strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> serialVersionUID = 8555883793099816127L;
<a name="76" href="#76">76</a>  	
<a name="77" href="#77">77</a>  	<strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_HELP = <span class="jxr_string">"help"</span>;
<a name="78" href="#78">78</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_CONFIG = <span class="jxr_string">"config"</span>;
<a name="79" href="#79">79</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_QUICKEDIT = <span class="jxr_string">"quickedit"</span>;
<a name="80" href="#80">80</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_ADD_CHANNEL = <span class="jxr_string">"add"</span>;
<a name="81" href="#81">81</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_VIEW_CATEGORIES = <span class="jxr_string">"categories"</span>;
<a name="82" href="#82">82</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String TAB_VIEW_CHANNELS = <span class="jxr_string">"channels"</span>;
<a name="83" href="#83">83</a>      <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String CSS_HEADER = <span class="jxr_string">"&lt;style type='text/css'&gt;"</span> 
<a name="84" href="#84">84</a>      	+ <span class="jxr_string">"&lt;!--"</span>
<a name="85" href="#85">85</a>          <em class="jxr_comment">//		+ "a:link,a:active,a:visited { color : #FFF240; } "</em>
<a name="86" href="#86">86</a>          <em class="jxr_comment">//		+ "a:hover { text-decoration: underline; color : #FFF240; } "</em>
<a name="87" href="#87">87</a>      	+ <span class="jxr_string">"body { background-color: #E5E5E5; } "</span>
<a name="88" href="#88">88</a>          + <span class="jxr_string">".bodyborder { background-color: #FFFFFF; border: 1px #98AAB1 solid; } "</span>
<a name="89" href="#89">89</a>          + <span class="jxr_string">".tableborder { background-color: #FFFFFF; border: 2px #006699 solid; } "</span>
<a name="90" href="#90">90</a>          + <span class="jxr_string">".smalltext { font-family: Verdana, Arial, Helvetica, sans-serif; font-size : 9px; } "</span>
<a name="91" href="#91">91</a>          + <span class="jxr_string">"font,th,td,p { font-family: Verdana, Arial, Helvetica, sans-serif; font-size : 12px; } "</span>
<a name="92" href="#92">92</a>          + <span class="jxr_string">"td.chlerror	{ background-color: #FF0000; } "</span>
<a name="93" href="#93">93</a>          + <span class="jxr_string">"td.chlwarning	{ background-color: #FFFF00; } "</span>
<a name="94" href="#94">94</a>          + <span class="jxr_string">"td.chldisabled	{ background-color: #CCCCCC; } "</span>
<a name="95" href="#95">95</a>          + <span class="jxr_string">"td.row1	{ background-color: #EFEFEF; vertical-align: top } "</span>
<a name="96" href="#96">96</a>          + <span class="jxr_string">"td.row2	{ background-color: #DEE3E7; vertical-align: top } "</span>
<a name="97" href="#97">97</a>          + <span class="jxr_string">"a.chlerror { color: #FFFFFF; text-decoration: underline} "</span>
<a name="98" href="#98">98</a>          + <span class="jxr_string">"a.head { color: #FFFFFF; text-decoration: none} "</span>
<a name="99" href="#99">99</a>          + <span class="jxr_string">"a:hover.head { text-decoration: underline; color : #FFF240; } "</span>
<a name="100" href="#100">100</a>         + <span class="jxr_string">"a.head2 { color: #FFFFFF; text-decoration: underline} "</span>
<a name="101" href="#101">101</a>         + <span class="jxr_string">"a:hover.head2 { text-decoration: underline; color : #FFF240; } "</span>
<a name="102" href="#102">102</a>         + <span class="jxr_string">"a.row { text-decoration: none} "</span>
<a name="103" href="#103">103</a>         + <span class="jxr_string">"a:hover.row { text-decoration: underline } "</span>
<a name="104" href="#104">104</a>         + <span class="jxr_string">"th	{ color: #FFF240; font-size: 11px; font-weight : bold; background-color: #408BFF; height: 25px; } "</span>
<a name="105" href="#105">105</a>         + <span class="jxr_string">"a.tableHead { color: #FFF240; text-decoration: underline} "</span>
<a name="106" href="#106">106</a>         + <span class="jxr_string">"th.subHead	{ background-color: #2D62B3; color: #FFFFFF; height: 18px;} "</span>
<a name="107" href="#107">107</a>         + <span class="jxr_string">"th.subHeadSelected	{ background-color: #408BFF; color: #FFFFFF; height: 18px;} "</span>
<a name="108" href="#108">108</a>         + <span class="jxr_string">"input,textarea, select {	color : #000000; font: normal 11px Verdana, Arial, Helvetica, sans-serif; border-width: 2px; border-color : #000000; } "</span>
<a name="109" href="#109">109</a>         + <span class="jxr_string">"--&gt;"</span>
<a name="110" href="#110">110</a>         + <span class="jxr_string">"&lt;/style&gt;"</span>;
<a name="111" href="#111">111</a> 
<a name="112" href="#112">112</a>     <em class="jxr_comment">// Magic value to indicate that the current password should not be changed.</em>
<a name="113" href="#113">113</a>     <em class="jxr_comment">// Currently used within posting/publishing configuration.</em>
<a name="114" href="#114">114</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String PASSWORD_MAGIC_KEY = <span class="jxr_string">"###__KCV__###"</span>;
<a name="115" href="#115">115</a> 
<a name="116" href="#116">116</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeHeader(Writer writer, String tab) <strong class="jxr_keyword">throws</strong> IOException {
<a name="117" href="#117">117</a> 
<a name="118" href="#118">118</a>         writer.write(<span class="jxr_string">"&lt;html&gt;&lt;head&gt;&lt;title&gt;nntp//rss admin&lt;/title&gt;"</span>);
<a name="119" href="#119">119</a>         writer.write(CSS_HEADER);
<a name="120" href="#120">120</a>         writer.write(<span class="jxr_string">"&lt;/head&gt;"</span>);
<a name="121" href="#121">121</a>         <em class="jxr_comment">//		writer.write("&lt;body topmargin='0' leftmargin='0' marginheight='0' marginwidth='0' bgcolor='#ffffff' link='#0000FF' alink='#0000FF' vlink='#0000FF'&gt;\n");</em>
<a name="122" href="#122">122</a>         writer.write(
<a name="123" href="#123">123</a>             <span class="jxr_string">"&lt;body bgcolor='#ffffff' link='#0000FF' alink='#0000FF' vlink='#0000FF'&gt;\n"</span>);
<a name="124" href="#124">124</a> 
<a name="125" href="#125">125</a>         writer.write(
<a name="126" href="#126">126</a>             <span class="jxr_string">"&lt;table width='100%' border='0' cellspacing='0' cellpadding='2'&gt;&lt;tr&gt;&lt;td class='bodyborder' bgcolor='#FFFFFF'&gt;"</span>);
<a name="127" href="#127">127</a> 
<a name="128" href="#128">128</a>         writer.write(
<a name="129" href="#129">129</a>             <span class="jxr_string">"&lt;table width='100%' border='0' cellspacing='3' cellpadding='0'&gt;"</span>);
<a name="130" href="#130">130</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='7'&gt;nntp//rss Administration&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="131" href="#131">131</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;"</span>);
<a name="132" href="#132">132</a>         writer.write(
<a name="133" href="#133">133</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="134" href="#134">134</a>                 + <span class="jxr_string">"' width='50%' align='left'&gt;&amp;nbsp;&lt;/th&gt;"</span>);
<a name="135" href="#135">135</a> <em class="jxr_comment">//		writer.write(</em>
<a name="136" href="#136">136</a> <em class="jxr_comment">//			"&lt;th class='subHead"</em>
<a name="137" href="#137">137</a> <em class="jxr_comment">//				+ (tab.equals(TAB_FIND_FEEDS) ? "Selected" : "")</em>
<a name="138" href="#138">138</a> <em class="jxr_comment">//				+ "' width='50%' align='left'&gt;&amp;nbsp;&lt;a class='head' href='?action=findfeedsform'&gt;Find Feeds&lt;/a&gt;&lt;/th&gt;");</em>
<a name="139" href="#139">139</a>         writer.write(
<a name="140" href="#140">140</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="141" href="#141">141</a>                 + (tab.equals(TAB_VIEW_CATEGORIES) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="142" href="#142">142</a>                 + <span class="jxr_string">"' nowrap='nowrap'&gt;&amp;nbsp;&lt;a class='head' href='?action=categories'&gt;Categories&lt;/a&gt;&amp;nbsp;&lt;/td&gt;"</span>);
<a name="143" href="#143">143</a>         writer.write(
<a name="144" href="#144">144</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="145" href="#145">145</a>                 + (tab.equals(TAB_VIEW_CHANNELS) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="146" href="#146">146</a>                 + <span class="jxr_string">"' nowrap='nowrap'&gt;&amp;nbsp;&lt;a class='head' href='/'&gt;Channels&lt;/a&gt;&amp;nbsp;&lt;/td&gt;"</span>);
<a name="147" href="#147">147</a>         writer.write(
<a name="148" href="#148">148</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="149" href="#149">149</a>                 + (tab.equals(TAB_ADD_CHANNEL) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="150" href="#150">150</a>                 + <span class="jxr_string">"' nowrap='nowrap'&gt;&amp;nbsp;&lt;a class='head' href='?action=addform'&gt;Add Channel&lt;/a&gt;&amp;nbsp;&lt;/td&gt;"</span>);
<a name="151" href="#151">151</a>         writer.write(
<a name="152" href="#152">152</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="153" href="#153">153</a>                 + (tab.equals(TAB_QUICKEDIT) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="154" href="#154">154</a>                 + <span class="jxr_string">"' nowrap='nowrap'&gt;&amp;nbsp;&lt;a class='head' href='?action=quickedit'&gt;Quick Edit&lt;/a&gt;&amp;nbsp;&lt;/td&gt;"</span>);
<a name="155" href="#155">155</a>         writer.write(
<a name="156" href="#156">156</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="157" href="#157">157</a>                 + (tab.equals(TAB_CONFIG) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="158" href="#158">158</a>                 + <span class="jxr_string">"' nowrap='nowrap'&gt;&amp;nbsp;&lt;a class='head' href='?action=showconfig'&gt;System Configuration&lt;/a&gt;&amp;nbsp;&lt;/td&gt;"</span>);
<a name="159" href="#159">159</a>         writer.write(
<a name="160" href="#160">160</a>             <span class="jxr_string">"&lt;th class='subHead"</span>
<a name="161" href="#161">161</a>                 + (tab.equals(TAB_HELP) ? <span class="jxr_string">"Selected"</span> : <span class="jxr_string">""</span>)
<a name="162" href="#162">162</a>                 + <span class="jxr_string">"' width='50%' align='right'&gt;&lt;a class='head' href='?action=help'&gt;Help&lt;/a&gt;&amp;nbsp;&lt;/th&gt;"</span>);
<a name="163" href="#163">163</a>         writer.write(<span class="jxr_string">"&lt;/tr&gt;"</span>);
<a name="164" href="#164">164</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="165" href="#165">165</a> 
<a name="166" href="#166">166</a>         writer.write(
<a name="167" href="#167">167</a>             <span class="jxr_string">"&lt;table border='0' cellspacing='0' cellpadding='0' height='100%' width='100%'&gt;"</span>);
<a name="168" href="#168">168</a>         <em class="jxr_comment">//		writer.write("&lt;tr&gt;&lt;td colspan='3' width='100%' bgcolor='#dddddd'&gt;&lt;font size='+2'&gt;&lt;b&gt;&amp;nbsp;nntp//rss Admin&lt;/b&gt;&lt;/font&gt;&lt;hr width='100%'&gt;&lt;/td&gt;&lt;/tr&gt;");</em>
<a name="169" href="#169">169</a>         <em class="jxr_comment">//		writer.write("&lt;tr height='100%'&gt;&lt;td valign='top' bgcolor='#dddddd'&gt;&lt;br&gt;&lt;a href='/'&gt;View Channels&lt;/a&gt;&lt;p&gt;&lt;a href='?action=addform'&gt;Add Channel&lt;/a&gt;&lt;p&gt;&lt;a href='?action=showconfig'&gt;System Configuration&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;td width='90%' height='100%' valign='top'&gt;&lt;br&gt;");</em>
<a name="170" href="#170">170</a>         writer.write(
<a name="171" href="#171">171</a>             <span class="jxr_string">"&lt;tr height='100%'&gt;&lt;td width='100%' height='100%' valign='top' align='center'&gt;&lt;br&gt;"</span>);
<a name="172" href="#172">172</a>     }
<a name="173" href="#173">173</a> 
<a name="174" href="#174">174</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeFooter(Writer writer) <strong class="jxr_keyword">throws</strong> IOException {
<a name="175" href="#175">175</a>         DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
<a name="176" href="#176">176</a> 
<a name="177" href="#177">177</a>         writer.write(<span class="jxr_string">"&lt;p&gt;"</span>);
<a name="178" href="#178">178</a>         writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="179" href="#179">179</a> 
<a name="180" href="#180">180</a>         writer.write(
<a name="181" href="#181">181</a>             <span class="jxr_string">"&lt;table cellspacing='0' cellpadding='2' width='100%'&gt;&lt;tr&gt;&lt;td class='row2'&gt;nntp//rss v"</span>
<a name="182" href="#182">182</a>                 + AppConstants.VERSION
<a name="183" href="#183">183</a>                 + <span class="jxr_string">"&lt;/td&gt;&lt;td class='row2' align='center'&gt;nntp//rss Time: "</span>
<a name="184" href="#184">184</a>                 + df.format(<strong class="jxr_keyword">new</strong> Date())
<a name="185" href="#185">185</a>                 + <span class="jxr_string">"&lt;/td&gt;&lt;td class='row2' align='right'&gt;&lt;a href='http://www.methodize.org/nntprss'&gt;nntp//rss home page&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="186" href="#186">186</a> 
<a name="187" href="#187">187</a>         writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="188" href="#188">188</a> 
<a name="189" href="#189">189</a>         writer.write(<span class="jxr_string">"&lt;/body&gt;&lt;/html&gt;"</span>);
<a name="190" href="#190">190</a>     }
<a name="191" href="#191">191</a> 
<a name="192" href="#192">192</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeConfig(
<a name="193" href="#193">193</a>         Writer writer,
<a name="194" href="#194">194</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager,
<a name="195" href="#195">195</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer)
<a name="196" href="#196">196</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="197" href="#197">197</a>         writer.write(<span class="jxr_string">"&lt;form action='?action=updateconfig' method='POST'&gt;"</span>);
<a name="198" href="#198">198</a>         writer.write(<span class="jxr_string">"&lt;table class='tableBorder'&gt;"</span>);
<a name="199" href="#199">199</a> 
<a name="200" href="#200">200</a>         writer.write(
<a name="201" href="#201">201</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='titleHead'&gt;System Configuration&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="202" href="#202">202</a> 
<a name="203" href="#203">203</a>         <em class="jxr_comment">// Polling</em>
<a name="204" href="#204">204</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='subHead'&gt;Polling&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="205" href="#205">205</a> 
<a name="206" href="#206">206</a>         writer.write(
<a name="207" href="#207">207</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;&lt;nobr&gt;Default Channel Polling Interval&lt;nobr&gt;&lt;/td&gt;"</span>);
<a name="208" href="#208">208</a>         writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;Every &lt;select name='pollingInterval'&gt;"</span>);
<a name="209" href="#209">209</a>         writer.write(
<a name="210" href="#210">210</a>             <span class="jxr_string">"&lt;option selected value='"</span>
<a name="211" href="#211">211</a>                 + channelManager.getPollingIntervalSeconds()
<a name="212" href="#212">212</a>                 + <span class="jxr_string">"'&gt;"</span>
<a name="213" href="#213">213</a>                 + channelManager.getPollingIntervalSeconds() / 60
<a name="214" href="#214">214</a>                 + <span class="jxr_string">"\n"</span>);
<a name="215" href="#215">215</a>         <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> interval = 10; interval &lt;= 120; interval += 10) {
<a name="216" href="#216">216</a>             writer.write(
<a name="217" href="#217">217</a>                 <span class="jxr_string">"&lt;option value='"</span> + (interval * 60) + <span class="jxr_string">"'&gt;"</span> + interval + <span class="jxr_string">"\n"</span>);
<a name="218" href="#218">218</a>         }
<a name="219" href="#219">219</a>         writer.write(<span class="jxr_string">"&lt;/select&gt; minutes &lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="220" href="#220">220</a> 
<a name="221" href="#221">221</a>         writer.write(
<a name="222" href="#222">222</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Observe HTTP 301&lt;/td&gt;"</span>);
<a name="223" href="#223">223</a>         writer.write(
<a name="224" href="#224">224</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='checkbox' name='observeHttp301' value='true' "</span>);
<a name="225" href="#225">225</a>         <strong class="jxr_keyword">if</strong> (channelManager.isObserveHttp301()) {
<a name="226" href="#226">226</a>             writer.write(<span class="jxr_string">"checked"</span>);
<a name="227" href="#227">227</a>         }
<a name="228" href="#228">228</a>         writer.write(
<a name="229" href="#229">229</a>             <span class="jxr_string">"&gt;&lt;br&gt;&lt;i&gt;When checked, nntp//rss will update the URL of a feed when a 301 (Permanent Redirection) message is received from the remote web server.&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="230" href="#230">230</a> 
<a name="231" href="#231">231</a>         <em class="jxr_comment">// NNTP Server</em>
<a name="232" href="#232">232</a>         writer.write(
<a name="233" href="#233">233</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='subHead'&gt;NNTP Server&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="234" href="#234">234</a> 
<a name="235" href="#235">235</a>         writer.write(
<a name="236" href="#236">236</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;This Machine's Hostname&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='hostName' value='"</span>
<a name="237" href="#237">237</a>                 + (nntpServer.getHostName() == <strong class="jxr_keyword">null</strong>
<a name="238" href="#238">238</a>                     ? <span class="jxr_string">""</span>
<a name="239" href="#239">239</a>                     : nntpServer.getHostName())
<a name="240" href="#240">240</a>                 + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;The host name of the machine running nntp//rss.  This is used when creating news:// links, and enabling access to the nntp//rss web interface from within your newsreader.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="241" href="#241">241</a> 
<a name="242" href="#242">242</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Content Type&lt;/td&gt;"</span>);
<a name="243" href="#243">243</a>         writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='contentType'&gt;"</span>);
<a name="244" href="#244">244</a>         <strong class="jxr_keyword">int</strong> contentType = nntpServer.getContentType();
<a name="245" href="#245">245</a>         writer.write(
<a name="246" href="#246">246</a>             <span class="jxr_string">"&lt;option value='"</span>
<a name="247" href="#247">247</a>                 + AppConstants.CONTENT_TYPE_MIXED
<a name="248" href="#248">248</a>                 + <span class="jxr_string">"'"</span>
<a name="249" href="#249">249</a>                 + (contentType == AppConstants.CONTENT_TYPE_MIXED
<a name="250" href="#250">250</a>                     ? <span class="jxr_string">" selected"</span>
<a name="251" href="#251">251</a>                     : <span class="jxr_string">""</span>)
<a name="252" href="#252">252</a>                 + <span class="jxr_string">"&gt;Text &amp; HTML (multipart/alternative)"</span>);
<a name="253" href="#253">253</a>         writer.write(
<a name="254" href="#254">254</a>             <span class="jxr_string">"&lt;option value='"</span>
<a name="255" href="#255">255</a>                 + AppConstants.CONTENT_TYPE_TEXT
<a name="256" href="#256">256</a>                 + <span class="jxr_string">"'"</span>
<a name="257" href="#257">257</a>                 + (contentType == AppConstants.CONTENT_TYPE_TEXT
<a name="258" href="#258">258</a>                     ? <span class="jxr_string">" selected"</span>
<a name="259" href="#259">259</a>                     : <span class="jxr_string">""</span>)
<a name="260" href="#260">260</a>                 + <span class="jxr_string">"&gt;Text (text/plain)"</span>);
<a name="261" href="#261">261</a>         writer.write(
<a name="262" href="#262">262</a>             <span class="jxr_string">"&lt;option value='"</span>
<a name="263" href="#263">263</a>                 + AppConstants.CONTENT_TYPE_HTML
<a name="264" href="#264">264</a>                 + <span class="jxr_string">"'"</span>
<a name="265" href="#265">265</a>                 + (contentType == AppConstants.CONTENT_TYPE_HTML
<a name="266" href="#266">266</a>                     ? <span class="jxr_string">" selected"</span>
<a name="267" href="#267">267</a>                     : <span class="jxr_string">""</span>)
<a name="268" href="#268">268</a>                 + <span class="jxr_string">"&gt;HTML (text/html)"</span>);
<a name="269" href="#269">269</a> 
<a name="270" href="#270">270</a>         writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="271" href="#271">271</a> 
<a name="272" href="#272">272</a>         writer.write(
<a name="273" href="#273">273</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Text (text/plain) Footnote URLs&lt;/td&gt;"</span>);
<a name="274" href="#274">274</a>         writer.write(
<a name="275" href="#275">275</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='checkbox' name='footnoteUrls' value='true' "</span>);
<a name="276" href="#276">276</a>         <strong class="jxr_keyword">if</strong> (nntpServer.isFootnoteUrls()) {
<a name="277" href="#277">277</a>             writer.write(<span class="jxr_string">"checked"</span>);
<a name="278" href="#278">278</a>         }
<a name="279" href="#279">279</a>         writer.write(<span class="jxr_string">"&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="280" href="#280">280</a> 
<a name="281" href="#281">281</a>         writer.write(
<a name="282" href="#282">282</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Authenticated NNTP Access&lt;/td&gt;"</span>);
<a name="283" href="#283">283</a>         writer.write(
<a name="284" href="#284">284</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='checkbox' name='nntpSecure' value='true' "</span>);
<a name="285" href="#285">285</a>         <strong class="jxr_keyword">if</strong> (nntpServer.isSecure()) {
<a name="286" href="#286">286</a>             writer.write(<span class="jxr_string">"checked"</span>);
<a name="287" href="#287">287</a>         }
<a name="288" href="#288">288</a>         writer.write(<span class="jxr_string">"&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="289" href="#289">289</a> 
<a name="290" href="#290">290</a>         <em class="jxr_comment">// Proxy</em>
<a name="291" href="#291">291</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='subHead'&gt;Proxy&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="292" href="#292">292</a> 
<a name="293" href="#293">293</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Use Proxy&lt;/td&gt;"</span>);
<a name="294" href="#294">294</a>         writer.write(
<a name="295" href="#295">295</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='checkbox' name='useProxy' value='true' "</span>);
<a name="296" href="#296">296</a>         <strong class="jxr_keyword">if</strong> (channelManager.isUseProxy()) {
<a name="297" href="#297">297</a>             writer.write(<span class="jxr_string">"checked"</span>);
<a name="298" href="#298">298</a>         }
<a name="299" href="#299">299</a>         writer.write(<span class="jxr_string">"&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="300" href="#300">300</a> 
<a name="301" href="#301">301</a>         writer.write(
<a name="302" href="#302">302</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Proxy Server Hostname&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='proxyServer' value='"</span>
<a name="303" href="#303">303</a>                 + (channelManager.getProxyServer() == <strong class="jxr_keyword">null</strong>
<a name="304" href="#304">304</a>                     ? <span class="jxr_string">""</span>
<a name="305" href="#305">305</a>                     : channelManager.getProxyServer())
<a name="306" href="#306">306</a>                 + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;Host name of your proxy server, leave blank if no proxy&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="307" href="#307">307</a>         writer.write(
<a name="308" href="#308">308</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Proxy Server Port&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='proxyPort' value='"</span>
<a name="309" href="#309">309</a>                 + (channelManager.getProxyPort() == 0
<a name="310" href="#310">310</a>                     ? <span class="jxr_string">""</span>
<a name="311" href="#311">311</a>                     : Integer.toString(channelManager.getProxyPort()))
<a name="312" href="#312">312</a>                 + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;Proxy server listener port, leave blank if no proxy&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="313" href="#313">313</a>         writer.write(
<a name="314" href="#314">314</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Proxy User ID&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='proxyUserID' value='"</span>
<a name="315" href="#315">315</a>                 + ((channelManager.getProxyUserID() == <strong class="jxr_keyword">null</strong>)
<a name="316" href="#316">316</a>                     ? <span class="jxr_string">""</span>
<a name="317" href="#317">317</a>                     : channelManager.getProxyUserID())
<a name="318" href="#318">318</a>                 + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;Proxy userid, leave blank if no userid&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="319" href="#319">319</a>         writer.write(
<a name="320" href="#320">320</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Proxy Password&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='password' name='proxyPassword' value='"</span>
<a name="321" href="#321">321</a>                 + ((channelManager.getProxyPassword() == <strong class="jxr_keyword">null</strong>)
<a name="322" href="#322">322</a>                     ? <span class="jxr_string">""</span>
<a name="323" href="#323">323</a>                     : channelManager.getProxyPassword())
<a name="324" href="#324">324</a>                 + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;Proxy password, leave blank if no password&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="325" href="#325">325</a> 
<a name="326" href="#326">326</a>         writer.write(
<a name="327" href="#327">327</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' name='update' value='Update'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="328" href="#328">328</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="329" href="#329">329</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="330" href="#330">330</a>         writer.write(<span class="jxr_string">"&lt;p&gt;"</span>);
<a name="331" href="#331">331</a>         writer.write(
<a name="332" href="#332">332</a>             <span class="jxr_string">"Export &lt;a class='row' href='/?action=export'&gt;nntp//rss&lt;/a&gt; or &lt;a class='row' href='/?action=exportopml'&gt;mySubscriptions.opml&lt;/a&gt; Channel List&lt;p&gt;"</span>);
<a name="333" href="#333">333</a>         writer.write(
<a name="334" href="#334">334</a>             <span class="jxr_string">"&lt;a class='row' href='/?action=importform'&gt;Import nntp//rss or mySubscriptions.opml Channel List&lt;/a&gt;"</span>);
<a name="335" href="#335">335</a>     }
<a name="336" href="#336">336</a> 
<a name="337" href="#337">337</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdShowConfig(
<a name="338" href="#338">338</a>         HttpServletResponse response)
<a name="339" href="#339">339</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="340" href="#340">340</a> 
<a name="341" href="#341">341</a>         Writer writer = response.getWriter();
<a name="342" href="#342">342</a>         writeHeader(writer, TAB_CONFIG);
<a name="343" href="#343">343</a> 
<a name="344" href="#344">344</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="345" href="#345">345</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="346" href="#346">346</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="347" href="#347">347</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer =
<a name="348" href="#348">348</a>             (<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a>) getServletContext().getAttribute(
<a name="349" href="#349">349</a>                 AdminServer.SERVLET_CTX_NNTP_SERVER);
<a name="350" href="#350">350</a> 
<a name="351" href="#351">351</a>         writeConfig(writer, channelManager, nntpServer);
<a name="352" href="#352">352</a>         writeFooter(writer);
<a name="353" href="#353">353</a>     }
<a name="354" href="#354">354</a> 
<a name="355" href="#355">355</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdUpdateConfig(
<a name="356" href="#356">356</a>         HttpServletRequest request,
<a name="357" href="#357">357</a>         HttpServletResponse response)
<a name="358" href="#358">358</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="359" href="#359">359</a> 
<a name="360" href="#360">360</a>         Writer writer = response.getWriter();
<a name="361" href="#361">361</a>         writeHeader(writer, TAB_CONFIG);
<a name="362" href="#362">362</a> 
<a name="363" href="#363">363</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="364" href="#364">364</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="365" href="#365">365</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="366" href="#366">366</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer =
<a name="367" href="#367">367</a>             (<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a>) getServletContext().getAttribute(
<a name="368" href="#368">368</a>                 AdminServer.SERVLET_CTX_NNTP_SERVER);
<a name="369" href="#369">369</a> 
<a name="370" href="#370">370</a>         <em class="jxr_comment">// NNTP Server config</em>
<a name="371" href="#371">371</a>         nntpServer.setContentType(
<a name="372" href="#372">372</a>             Integer.parseInt(request.getParameter(<span class="jxr_string">"contentType"</span>)));
<a name="373" href="#373">373</a> 
<a name="374" href="#374">374</a>         String secure = request.getParameter(<span class="jxr_string">"nntpSecure"</span>);
<a name="375" href="#375">375</a>         nntpServer.setSecure((secure != <strong class="jxr_keyword">null</strong>) &amp;&amp; secure.equals(<span class="jxr_string">"true"</span>));
<a name="376" href="#376">376</a> 
<a name="377" href="#377">377</a>         String footnoteUrls = request.getParameter(<span class="jxr_string">"footnoteUrls"</span>);
<a name="378" href="#378">378</a>         nntpServer.setFootnoteUrls(
<a name="379" href="#379">379</a>             (footnoteUrls != <strong class="jxr_keyword">null</strong>) &amp;&amp; footnoteUrls.equals(<span class="jxr_string">"true"</span>));
<a name="380" href="#380">380</a> 
<a name="381" href="#381">381</a>         <em class="jxr_comment">// We will not allow the hostname to be blank - if the user erases the</em>
<a name="382" href="#382">382</a>         <em class="jxr_comment">// contents of the field, default to the current host name</em>
<a name="383" href="#383">383</a>         nntpServer.setHostName(request.getParameter(<span class="jxr_string">"hostName"</span>).trim());
<a name="384" href="#384">384</a>         <strong class="jxr_keyword">if</strong> (nntpServer.getHostName().length() == 0) {
<a name="385" href="#385">385</a>             nntpServer.setHostName(AppConstants.getCurrentHostName());
<a name="386" href="#386">386</a>         }
<a name="387" href="#387">387</a>         nntpServer.saveConfiguration();
<a name="388" href="#388">388</a> 
<a name="389" href="#389">389</a>         <em class="jxr_comment">// Channel Manager config</em>
<a name="390" href="#390">390</a>         channelManager.setPollingIntervalSeconds(
<a name="391" href="#391">391</a>             Long.parseLong(request.getParameter(<span class="jxr_string">"pollingInterval"</span>)));
<a name="392" href="#392">392</a>         String observeHttp301 = request.getParameter(<span class="jxr_string">"observeHttp301"</span>);
<a name="393" href="#393">393</a>         channelManager.setObserveHttp301(
<a name="394" href="#394">394</a>             (observeHttp301 != <strong class="jxr_keyword">null</strong>) &amp;&amp; observeHttp301.equals(<span class="jxr_string">"true"</span>));
<a name="395" href="#395">395</a> 
<a name="396" href="#396">396</a>         channelManager.setProxyServer(
<a name="397" href="#397">397</a>             request.getParameter(<span class="jxr_string">"proxyServer"</span>).trim());
<a name="398" href="#398">398</a>         String proxyPortStr = request.getParameter(<span class="jxr_string">"proxyPort"</span>);
<a name="399" href="#399">399</a>         <strong class="jxr_keyword">boolean</strong> validPort = <strong class="jxr_keyword">true</strong>;
<a name="400" href="#400">400</a> 
<a name="401" href="#401">401</a>         <strong class="jxr_keyword">if</strong> (proxyPortStr.length() == 0) {
<a name="402" href="#402">402</a>             channelManager.setProxyPort(0);
<a name="403" href="#403">403</a>         } <strong class="jxr_keyword">else</strong> {
<a name="404" href="#404">404</a>             <strong class="jxr_keyword">try</strong> {
<a name="405" href="#405">405</a>                 channelManager.setProxyPort(Integer.parseInt(proxyPortStr));
<a name="406" href="#406">406</a>             } <strong class="jxr_keyword">catch</strong> (NumberFormatException nfe) {
<a name="407" href="#407">407</a>                 validPort = false;
<a name="408" href="#408">408</a>             }
<a name="409" href="#409">409</a>         }
<a name="410" href="#410">410</a> 
<a name="411" href="#411">411</a>         channelManager.setProxyUserID(
<a name="412" href="#412">412</a>             request.getParameter(<span class="jxr_string">"proxyUserID"</span>).trim());
<a name="413" href="#413">413</a>         channelManager.setProxyPassword(
<a name="414" href="#414">414</a>             request.getParameter(<span class="jxr_string">"proxyPassword"</span>).trim());
<a name="415" href="#415">415</a>         String useProxy = request.getParameter(<span class="jxr_string">"useProxy"</span>);
<a name="416" href="#416">416</a>         channelManager.setUseProxy(
<a name="417" href="#417">417</a>             (useProxy != <strong class="jxr_keyword">null</strong>) &amp;&amp; useProxy.equals(<span class="jxr_string">"true"</span>));
<a name="418" href="#418">418</a> 
<a name="419" href="#419">419</a>         <strong class="jxr_keyword">if</strong> (validPort == <strong class="jxr_keyword">true</strong>) {
<a name="420" href="#420">420</a>             channelManager.saveConfiguration();
<a name="421" href="#421">421</a>             writer.write(<span class="jxr_string">"System configuration successfully updated.&lt;p&gt;"</span>);
<a name="422" href="#422">422</a>         } <strong class="jxr_keyword">else</strong> {
<a name="423" href="#423">423</a>             writer.write(
<a name="424" href="#424">424</a>                 <span class="jxr_string">"&lt;b&gt;Proxy port must either be blank or a numeric value!&lt;/b&gt;&lt;p&gt;"</span>);
<a name="425" href="#425">425</a>         }
<a name="426" href="#426">426</a> 
<a name="427" href="#427">427</a>         writeConfig(writer, channelManager, nntpServer);
<a name="428" href="#428">428</a>         writeFooter(writer);
<a name="429" href="#429">429</a>     }
<a name="430" href="#430">430</a> 
<a name="431" href="#431">431</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">boolean</strong> isChecked(HttpServletRequest request, String checkbox) {
<a name="432" href="#432">432</a>         String checkboxValue = request.getParameter(checkbox);
<a name="433" href="#433">433</a>         <strong class="jxr_keyword">if</strong> (checkboxValue != <strong class="jxr_keyword">null</strong> &amp;&amp; checkboxValue.equals(<span class="jxr_string">"true"</span>)) {
<a name="434" href="#434">434</a>             <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">true</strong>;
<a name="435" href="#435">435</a>         } <strong class="jxr_keyword">else</strong> {
<a name="436" href="#436">436</a>             <strong class="jxr_keyword">return</strong> false;
<a name="437" href="#437">437</a>         }
<a name="438" href="#438">438</a>     }
<a name="439" href="#439">439</a> 
<a name="440" href="#440">440</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeChannel(
<a name="441" href="#441">441</a>         Writer writer,
<a name="442" href="#442">442</a>         <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel,
<a name="443" href="#443">443</a>         HttpServletRequest request,
<a name="444" href="#444">444</a>         <strong class="jxr_keyword">boolean</strong> refresh)
<a name="445" href="#445">445</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="446" href="#446">446</a>         <strong class="jxr_keyword">if</strong> (channel == <strong class="jxr_keyword">null</strong>) {
<a name="447" href="#447">447</a>             writer.write(<span class="jxr_string">"&lt;b&gt;Channel "</span> + channel.getName() + <span class="jxr_string">" not found!&lt;/b&gt;"</span>);
<a name="448" href="#448">448</a>         } <strong class="jxr_keyword">else</strong> {
<a name="449" href="#449">449</a>             <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="450" href="#450">450</a>                 (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="451" href="#451">451</a>                     AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="452" href="#452">452</a> 
<a name="453" href="#453">453</a>             DateFormat df =
<a name="454" href="#454">454</a>                 DateFormat.getDateTimeInstance(
<a name="455" href="#455">455</a>                     DateFormat.FULL,
<a name="456" href="#456">456</a>                     DateFormat.FULL);
<a name="457" href="#457">457</a> 
<a name="458" href="#458">458</a>             String url =
<a name="459" href="#459">459</a>                 ((!refresh) ? channel.getUrl() : request.getParameter(<span class="jxr_string">"URL"</span>));
<a name="460" href="#460">460</a>             <strong class="jxr_keyword">boolean</strong> enabled =
<a name="461" href="#461">461</a>                 ((!refresh)
<a name="462" href="#462">462</a>                     ? channel.isEnabled()
<a name="463" href="#463">463</a>                     : isChecked(request, <span class="jxr_string">"enabled"</span>));
<a name="464" href="#464">464</a>             <strong class="jxr_keyword">boolean</strong> parseAtAllCost =
<a name="465" href="#465">465</a>                 ((!refresh)
<a name="466" href="#466">466</a>                     ? channel.isParseAtAllCost()
<a name="467" href="#467">467</a>                     : isChecked(request, <span class="jxr_string">"parseAtAllCost"</span>));
<a name="468" href="#468">468</a>             <em class="jxr_comment">//			boolean historical = ((!refresh) ? channel.isHistorical() : isChecked(request, "historical"));</em>
<a name="469" href="#469">469</a>             <strong class="jxr_keyword">boolean</strong> postingEnabled =
<a name="470" href="#470">470</a>                 ((!refresh)
<a name="471" href="#471">471</a>                     ? channel.isPostingEnabled()
<a name="472" href="#472">472</a>                     : (!request.getParameter(<span class="jxr_string">"postingEnabled"</span>).equals(<span class="jxr_string">"false"</span>)));
<a name="473" href="#473">473</a>             String publishAPI =
<a name="474" href="#474">474</a>                 ((!refresh)
<a name="475" href="#475">475</a>                     ? channel.getPublishAPI()
<a name="476" href="#476">476</a>                     : request.getParameter(<span class="jxr_string">"publishAPI"</span>));
<a name="477" href="#477">477</a> <em class="jxr_comment">//            long pollingIntervalSeconds =</em>
<a name="478" href="#478">478</a> <em class="jxr_comment">//                ((!refresh)</em>
<a name="479" href="#479">479</a> <em class="jxr_comment">//                    ? channel.getPollingIntervalSeconds()</em>
<a name="480" href="#480">480</a> <em class="jxr_comment">//                    : Long.parseLong(request.getParameter("pollingInterval")));</em>
<a name="481" href="#481">481</a> <em class="jxr_comment">//            long expiration =</em>
<a name="482" href="#482">482</a> <em class="jxr_comment">//                ((!refresh)</em>
<a name="483" href="#483">483</a> <em class="jxr_comment">//                    ? channel.getExpiration()</em>
<a name="484" href="#484">484</a> <em class="jxr_comment">//                    : Long.parseLong(request.getParameter("expiration")));</em>
<a name="485" href="#485">485</a>             <strong class="jxr_keyword">int</strong> categoryId = 0;
<a name="486" href="#486">486</a>             <strong class="jxr_keyword">if</strong> (!refresh) {
<a name="487" href="#487">487</a>                 <strong class="jxr_keyword">if</strong> (channel.getCategory() != <strong class="jxr_keyword">null</strong>) {
<a name="488" href="#488">488</a>                     categoryId = channel.getCategory().getId();
<a name="489" href="#489">489</a>                 }
<a name="490" href="#490">490</a>             } <strong class="jxr_keyword">else</strong> {
<a name="491" href="#491">491</a>                 categoryId =
<a name="492" href="#492">492</a>                     Integer.parseInt(request.getParameter(<span class="jxr_string">"categoryId"</span>));
<a name="493" href="#493">493</a>             }
<a name="494" href="#494">494</a> 
<a name="495" href="#495">495</a>             writer.write(
<a name="496" href="#496">496</a>                 <span class="jxr_string">"&lt;form name='channel' action='?action=update' method='POST'&gt;"</span>);
<a name="497" href="#497">497</a>             writer.write(
<a name="498" href="#498">498</a>                 <span class="jxr_string">"&lt;input type='hidden' name='name' value='"</span>
<a name="499" href="#499">499</a>                     + HTMLHelper.escapeString(channel.getName())
<a name="500" href="#500">500</a>                     + <span class="jxr_string">"'&gt;"</span>);
<a name="501" href="#501">501</a>             writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="502" href="#502">502</a> 
<a name="503" href="#503">503</a>             writer.write(
<a name="504" href="#504">504</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;th class='tableHead' colspan='2'&gt;Channel Configuration&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="505" href="#505">505</a> 
<a name="506" href="#506">506</a>             writer.write(
<a name="507" href="#507">507</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Title&lt;/td&gt;&lt;td class='row2'&gt;"</span>
<a name="508" href="#508">508</a>                     + HTMLHelper.escapeString(
<a name="509" href="#509">509</a>                         channel.getTitle() == <strong class="jxr_keyword">null</strong>
<a name="510" href="#510">510</a>                             ? <span class="jxr_string">"Unknown"</span>
<a name="511" href="#511">511</a>                             : channel.getTitle())
<a name="512" href="#512">512</a>                     + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="513" href="#513">513</a>             writer.write(
<a name="514" href="#514">514</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Newsgroup Name&lt;/td&gt;&lt;td class='row2'&gt;"</span>
<a name="515" href="#515">515</a>                     + HTMLHelper.escapeString(channel.getName())
<a name="516" href="#516">516</a>                     + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="517" href="#517">517</a>             writer.write(
<a name="518" href="#518">518</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;URL&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='URL' value='"</span>
<a name="519" href="#519">519</a>                     + HTMLHelper.escapeString(url)
<a name="520" href="#520">520</a>                     + <span class="jxr_string">"' size='64'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="521" href="#521">521</a>             writer.write(
<a name="522" href="#522">522</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Polling&lt;/td&gt;&lt;td class='row2'&gt;"</span>
<a name="523" href="#523">523</a>                     + <span class="jxr_string">"&lt;input name='enabled' type='checkbox' value='true' "</span>
<a name="524" href="#524">524</a>                     + (enabled ? <span class="jxr_string">"checked&gt;"</span> : <span class="jxr_string">"&gt;"</span>)
<a name="525" href="#525">525</a>                     + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="526" href="#526">526</a> 
<a name="527" href="#527">527</a>             writer.write(
<a name="528" href="#528">528</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Polling Interval&lt;/td&gt;"</span>);
<a name="529" href="#529">529</a>             writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='pollingInterval'&gt;"</span>);
<a name="530" href="#530">530</a> 
<a name="531" href="#531">531</a>             <strong class="jxr_keyword">if</strong> (channel.getPollingIntervalSeconds()
<a name="532" href="#532">532</a>                 == Channel.DEFAULT_POLLING_INTERVAL) {
<a name="533" href="#533">533</a>                 writer.write(
<a name="534" href="#534">534</a>                     <span class="jxr_string">"&lt;option selected value='"</span>
<a name="535" href="#535">535</a>                         + Channel.DEFAULT_POLLING_INTERVAL
<a name="536" href="#536">536</a>                         + <span class="jxr_string">"'&gt;Use Default Polling Interval\n"</span>);
<a name="537" href="#537">537</a>             } <strong class="jxr_keyword">else</strong> {
<a name="538" href="#538">538</a>                 writer.write(
<a name="539" href="#539">539</a>                     <span class="jxr_string">"&lt;option selected value='"</span>
<a name="540" href="#540">540</a>                         + channel.getPollingIntervalSeconds()
<a name="541" href="#541">541</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="542" href="#542">542</a>                         + channel.getPollingIntervalSeconds() / 60
<a name="543" href="#543">543</a>                         + <span class="jxr_string">" minutes\n"</span>);
<a name="544" href="#544">544</a>             }
<a name="545" href="#545">545</a> 
<a name="546" href="#546">546</a>             writer.write(
<a name="547" href="#547">547</a>                 <span class="jxr_string">"&lt;option value='"</span>
<a name="548" href="#548">548</a>                     + Channel.DEFAULT_POLLING_INTERVAL
<a name="549" href="#549">549</a>                     + <span class="jxr_string">"'&gt;Use Default Polling Interval\n"</span>);
<a name="550" href="#550">550</a>             <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> interval = 10; interval &lt;= 120; interval += 10) {
<a name="551" href="#551">551</a>                 writer.write(
<a name="552" href="#552">552</a>                     <span class="jxr_string">"&lt;option value='"</span>
<a name="553" href="#553">553</a>                         + (interval * 60)
<a name="554" href="#554">554</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="555" href="#555">555</a>                         + interval
<a name="556" href="#556">556</a>                         + <span class="jxr_string">" minutes\n"</span>);
<a name="557" href="#557">557</a>             }
<a name="558" href="#558">558</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="559" href="#559">559</a> 
<a name="560" href="#560">560</a>             writer.write(
<a name="561" href="#561">561</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Parse-at-all-costs&lt;/td&gt;&lt;td class='row2'&gt;&lt;input name='parseAtAllCost' type='checkbox' value='true' "</span>
<a name="562" href="#562">562</a>                     + (parseAtAllCost ? <span class="jxr_string">"checked&gt;"</span> : <span class="jxr_string">"&gt;"</span>)
<a name="563" href="#563">563</a>                     + <span class="jxr_string">"&lt;br&gt;&lt;i&gt;This will enable the experimental parse-at-all-costs RSS parser.  This feature supports the parsing of badly-formatted RSS feeds.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="564" href="#564">564</a> 
<a name="565" href="#565">565</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Status&lt;/td&gt;"</span>);
<a name="566" href="#566">566</a> 
<a name="567" href="#567">567</a>             <strong class="jxr_keyword">switch</strong> (channel.getStatus()) {
<a name="568" href="#568">568</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_NOT_FOUND :
<a name="569" href="#569">569</a>                     writer.write(
<a name="570" href="#570">570</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;Feed Web Server is returning File Not Found.&lt;/font&gt;"</span>);
<a name="571" href="#571">571</a>                     <strong class="jxr_keyword">break</strong>;
<a name="572" href="#572">572</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_INVALID_CONTENT :
<a name="573" href="#573">573</a>                     writer.write(
<a name="574" href="#574">574</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;Last feed document retrieved could not be parsed, &lt;a class='chlerror' target='validate' href='http://feedvalidator.org/check?url="</span>
<a name="575" href="#575">575</a>                             + HTMLHelper.escapeString(url)
<a name="576" href="#576">576</a>                             + <span class="jxr_string">"'&gt;check URL&lt;/a&gt;.&lt;/font&gt;"</span>);
<a name="577" href="#577">577</a>                     <strong class="jxr_keyword">break</strong>;
<a name="578" href="#578">578</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_UNKNOWN_HOST :
<a name="579" href="#579">579</a>                     writer.write(
<a name="580" href="#580">580</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;Unable to contact Feed Web Server (Unknown Host).  Check URL.&lt;/font&gt;"</span>);
<a name="581" href="#581">581</a>                     <strong class="jxr_keyword">break</strong>;
<a name="582" href="#582">582</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_NO_ROUTE_TO_HOST :
<a name="583" href="#583">583</a>                     writer.write(
<a name="584" href="#584">584</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;Unable to contact Feed Web Server (No Route To Host).  Check URL.&lt;/font&gt;"</span>);
<a name="585" href="#585">585</a>                     <strong class="jxr_keyword">break</strong>;
<a name="586" href="#586">586</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_CONNECTION_TIMEOUT :
<a name="587" href="#587">587</a>                     writer.write(
<a name="588" href="#588">588</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;&lt;font color='#000000'&gt;Currently unable to contact Feed Web Server (Connection timeout).&lt;/font&gt;"</span>);
<a name="589" href="#589">589</a>                     <strong class="jxr_keyword">break</strong>;
<a name="590" href="#590">590</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_SOCKET_EXCEPTION :
<a name="591" href="#591">591</a>                     writer.write(
<a name="592" href="#592">592</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;&lt;font color='#000000'&gt;Currently unable to contact Feed Web Server (Socket exception).&lt;/font&gt;"</span>);
<a name="593" href="#593">593</a>                     <strong class="jxr_keyword">break</strong>;
<a name="594" href="#594">594</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_PROXY_AUTHENTICATION_REQUIRED :
<a name="595" href="#595">595</a>                     writer.write(
<a name="596" href="#596">596</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FFFF00'&gt;&lt;font color='#FFFFFF'&gt;Proxy authentication required.  Please configure user name and password in &lt;a class='chlerror' href='?action=showconfig'&gt;System Configuration&lt;/a&gt;.&lt;/font&gt;"</span>);
<a name="597" href="#597">597</a>                     <strong class="jxr_keyword">break</strong>;
<a name="598" href="#598">598</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_USER_AUTHENTICATION_REQUIRED :
<a name="599" href="#599">599</a>                     writer.write(
<a name="600" href="#600">600</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FFFF00'&gt;&lt;font color='#FFFFFF'&gt;User authentication required. Please specific user name and password in the URL, e.g.&lt;br&gt;http://username:password@www.myhost.com/feed.xml&lt;/font&gt;"</span>);
<a name="601" href="#601">601</a>                     <strong class="jxr_keyword">break</strong>;
<a name="602" href="#602">602</a>                 <strong class="jxr_keyword">default</strong> :
<a name="603" href="#603">603</a>                     writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;OK"</span>);
<a name="604" href="#604">604</a>             }
<a name="605" href="#605">605</a> 
<a name="606" href="#606">606</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="607" href="#607">607</a> 
<a name="608" href="#608">608</a>             writer.write(
<a name="609" href="#609">609</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Last Polled&lt;/td&gt;&lt;td class='row2'&gt;"</span>
<a name="610" href="#610">610</a>                     + ((channel.getLastPolled() == <strong class="jxr_keyword">null</strong>)
<a name="611" href="#611">611</a>                         ? <span class="jxr_string">"Yet to be polled."</span>
<a name="612" href="#612">612</a>                         : df.format(channel.getLastPolled()))
<a name="613" href="#613">613</a>                     + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="614" href="#614">614</a>             writer.write(
<a name="615" href="#615">615</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Last Modified&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="616" href="#616">616</a>             <strong class="jxr_keyword">if</strong> (channel.getLastModified() == 0) {
<a name="617" href="#617">617</a>                 writer.write(<span class="jxr_string">"Last modified not supplied by Feed Web Server"</span>);
<a name="618" href="#618">618</a>             } <strong class="jxr_keyword">else</strong> {
<a name="619" href="#619">619</a>                 writer.write(df.format(<strong class="jxr_keyword">new</strong> Date(channel.getLastModified())));
<a name="620" href="#620">620</a>             }
<a name="621" href="#621">621</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="622" href="#622">622</a>             writer.write(
<a name="623" href="#623">623</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Last ETag&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="624" href="#624">624</a>             <strong class="jxr_keyword">if</strong> (channel.getLastETag() == <strong class="jxr_keyword">null</strong>) {
<a name="625" href="#625">625</a>                 writer.write(<span class="jxr_string">"ETag not supplied by Feed Web Server"</span>);
<a name="626" href="#626">626</a>             } <strong class="jxr_keyword">else</strong> {
<a name="627" href="#627">627</a>                 writer.write(channel.getLastETag());
<a name="628" href="#628">628</a>             }
<a name="629" href="#629">629</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="630" href="#630">630</a> 
<a name="631" href="#631">631</a>             writer.write(
<a name="632" href="#632">632</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Feed Type&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="633" href="#633">633</a>             <strong class="jxr_keyword">if</strong> (channel.getRssVersion() == <strong class="jxr_keyword">null</strong>) {
<a name="634" href="#634">634</a>                 writer.write(<span class="jxr_string">"Unknown"</span>);
<a name="635" href="#635">635</a>             } <strong class="jxr_keyword">else</strong> {
<a name="636" href="#636">636</a>                 writer.write(channel.getRssVersion());
<a name="637" href="#637">637</a>             }
<a name="638" href="#638">638</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="639" href="#639">639</a> 
<a name="640" href="#640">640</a>             <em class="jxr_comment">//			writer.write("&lt;tr&gt;&lt;td class='row1' align='right'&gt;Historical&lt;/td&gt;&lt;td class='row2'&gt;&lt;input name='historical' type='checkbox' value='true' "</em>
<a name="641" href="#641">641</a>             <em class="jxr_comment">//				+ (historical ? "checked&gt;" : "&gt;")</em>
<a name="642" href="#642">642</a>             <em class="jxr_comment">//				+ "&lt;/td&gt;&lt;/tr&gt;");</em>
<a name="643" href="#643">643</a> 
<a name="644" href="#644">644</a>             writeExpiration(writer, channel);
<a name="645" href="#645">645</a> 
<a name="646" href="#646">646</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Category&lt;/td&gt;"</span>);
<a name="647" href="#647">647</a>             writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='categoryId'&gt;"</span>);
<a name="648" href="#648">648</a> 
<a name="649" href="#649">649</a>             writeOption(writer, <span class="jxr_string">"[No Category]"</span>, 0, categoryId);
<a name="650" href="#650">650</a>             Iterator categories = channelManager.categories();
<a name="651" href="#651">651</a>             <strong class="jxr_keyword">while</strong> (categories.hasNext()) {
<a name="652" href="#652">652</a>                 <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = (Category) categories.next();
<a name="653" href="#653">653</a>                 writeOption(
<a name="654" href="#654">654</a>                     writer,
<a name="655" href="#655">655</a>                     category.getName(),
<a name="656" href="#656">656</a>                     category.getId(),
<a name="657" href="#657">657</a>                     categoryId);
<a name="658" href="#658">658</a>             }
<a name="659" href="#659">659</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="660" href="#660">660</a> 
<a name="661" href="#661">661</a>             writer.write(
<a name="662" href="#662">662</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Managing Editor&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="663" href="#663">663</a>             <strong class="jxr_keyword">if</strong> (channel.getManagingEditor() != <strong class="jxr_keyword">null</strong>) {
<a name="664" href="#664">664</a>                 writer.write(
<a name="665" href="#665">665</a>                     <span class="jxr_string">"&lt;a href='mailto:"</span>
<a name="666" href="#666">666</a>                         + URLEncoder.encode(
<a name="667" href="#667">667</a>                             RSSHelper.parseEmail(channel.getManagingEditor()))
<a name="668" href="#668">668</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="669" href="#669">669</a>                         + HTMLHelper.escapeString(channel.getManagingEditor())
<a name="670" href="#670">670</a>                         + <span class="jxr_string">"&lt;/a&gt;"</span>);
<a name="671" href="#671">671</a>             } <strong class="jxr_keyword">else</strong> {
<a name="672" href="#672">672</a>                 writer.write(<span class="jxr_string">"Unknown"</span>);
<a name="673" href="#673">673</a>             }
<a name="674" href="#674">674</a> 
<a name="675" href="#675">675</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="676" href="#676">676</a>             writer.write(
<a name="677" href="#677">677</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Posting&lt;/td&gt;&lt;td class='row2'&gt;&lt;select name='postingEnabled' onChange='this.form.action=\&quot;?action=editchlrefresh\&quot;; this.form.submit();'&gt;"</span>
<a name="678" href="#678">678</a>                     + <span class="jxr_string">"&lt;option "</span>
<a name="679" href="#679">679</a>                     + (postingEnabled ? <span class="jxr_string">"selected"</span> : <span class="jxr_string">""</span>)
<a name="680" href="#680">680</a>                     + <span class="jxr_string">"&gt;true"</span>
<a name="681" href="#681">681</a>                     + <span class="jxr_string">"&lt;option "</span>
<a name="682" href="#682">682</a>                     + (!postingEnabled ? <span class="jxr_string">"selected"</span> : <span class="jxr_string">""</span>)
<a name="683" href="#683">683</a>                     + <span class="jxr_string">"&gt;false"</span>
<a name="684" href="#684">684</a>                     + <span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="685" href="#685">685</a> 
<a name="686" href="#686">686</a>             <strong class="jxr_keyword">if</strong> (postingEnabled) {
<a name="687" href="#687">687</a> 
<a name="688" href="#688">688</a>                 writer.write(
<a name="689" href="#689">689</a>                     <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead' colspan='2' align='center'&gt;Posting Configuration&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="690" href="#690">690</a> 
<a name="691" href="#691">691</a>                 writer
<a name="692" href="#692">692</a>                     .write(
<a name="693" href="#693">693</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;API&lt;/td&gt;&lt;td class='row2'&gt;&lt;select name='publishAPI' onChange='this.form.action=\&quot;?action=editchlrefresh&amp;publishapichange=true\&quot;; this.form.submit();'&gt;"</span>
<a name="694" href="#694">694</a>                         + <span class="jxr_string">"&lt;option value='blogger' "</span>
<a name="695" href="#695">695</a>                         + (publishAPI == <strong class="jxr_keyword">null</strong>
<a name="696" href="#696">696</a>                             || publishAPI.equals(<span class="jxr_string">"blogger"</span>) ? <span class="jxr_string">"selected"</span> : <span class="jxr_string">""</span>)
<a name="697" href="#697">697</a>                         + <span class="jxr_string">"&gt;Blogger"</span>
<a name="698" href="#698">698</a>                         + <span class="jxr_string">"&lt;option value='livejournal' "</span>
<a name="699" href="#699">699</a>                         + (publishAPI != <strong class="jxr_keyword">null</strong>
<a name="700" href="#700">700</a>                             &amp;&amp; publishAPI.equals(<span class="jxr_string">"livejournal"</span>) ? <span class="jxr_string">"selected"</span> : <span class="jxr_string">""</span>)
<a name="701" href="#701">701</a>                         + <span class="jxr_string">"&gt;LiveJournal"</span>
<a name="702" href="#702">702</a>                         + <span class="jxr_string">"&lt;option value='metaweblog' "</span>
<a name="703" href="#703">703</a>                         + (publishAPI != <strong class="jxr_keyword">null</strong>
<a name="704" href="#704">704</a>                             &amp;&amp; publishAPI.equals(<span class="jxr_string">"metaweblog"</span>) ? <span class="jxr_string">"selected"</span> : <span class="jxr_string">""</span>)
<a name="705" href="#705">705</a>                         + <span class="jxr_string">"&gt;MetaWeblog"</span>
<a name="706" href="#706">706</a>                 <em class="jxr_comment">//					+ "&lt;option " + (!postingEnabled ? "selected" : "") + "&gt;false"</em>
<a name="707" href="#707">707</a>                 +<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="708" href="#708">708</a> 
<a name="709" href="#709">709</a>                 <strong class="jxr_keyword">if</strong> (publishAPI == <strong class="jxr_keyword">null</strong> || publishAPI.equals(<span class="jxr_string">"blogger"</span>)) {
<a name="710" href="#710">710</a>                     <em class="jxr_comment">// Default API</em>
<a name="711" href="#711">711</a>                     String publishUrl = <strong class="jxr_keyword">null</strong>;
<a name="712" href="#712">712</a>                     String blogId = <strong class="jxr_keyword">null</strong>;
<a name="713" href="#713">713</a>                     String userName = <strong class="jxr_keyword">null</strong>;
<a name="714" href="#714">714</a>                     String password = <strong class="jxr_keyword">null</strong>;
<a name="715" href="#715">715</a>                     <strong class="jxr_keyword">boolean</strong> autoPublish = <strong class="jxr_keyword">true</strong>;
<a name="716" href="#716">716</a> 
<a name="717" href="#717">717</a>                     <strong class="jxr_keyword">if</strong> (refresh) {
<a name="718" href="#718">718</a>                         <em class="jxr_comment">// If a refresh, get the parameter values from the parameter collection</em>
<a name="719" href="#719">719</a>                         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"publishapichange"</span>) == <strong class="jxr_keyword">null</strong>) {
<a name="720" href="#720">720</a>                             publishUrl =
<a name="721" href="#721">721</a>                                 request.getParameter(
<a name="722" href="#722">722</a>                                     BloggerPublisher.PROP_PUBLISHER_URL);
<a name="723" href="#723">723</a>                         }
<a name="724" href="#724">724</a>                         blogId =
<a name="725" href="#725">725</a>                             (String) request.getParameter(
<a name="726" href="#726">726</a>                                 BloggerPublisher.PROP_BLOG_ID);
<a name="727" href="#727">727</a>                         userName =
<a name="728" href="#728">728</a>                             (String) request.getParameter(
<a name="729" href="#729">729</a>                                 BloggerPublisher.PROP_USERNAME);
<a name="730" href="#730">730</a>                         password =
<a name="731" href="#731">731</a>                             (String) request.getParameter(
<a name="732" href="#732">732</a>                                 BloggerPublisher.PROP_PASSWORD);
<a name="733" href="#733">733</a>                         String autoPublishStr =
<a name="734" href="#734">734</a>                             request.getParameter(BloggerPublisher.PROP_PUBLISH);
<a name="735" href="#735">735</a>                         autoPublish =
<a name="736" href="#736">736</a>                             (autoPublishStr != <strong class="jxr_keyword">null</strong>
<a name="737" href="#737">737</a>                                 &amp;&amp; autoPublishStr.equals(<span class="jxr_string">"false"</span>))
<a name="738" href="#738">738</a>                                 ? false
<a name="739" href="#739">739</a>                                 : <strong class="jxr_keyword">true</strong>;
<a name="740" href="#740">740</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="741" href="#741">741</a>                         <em class="jxr_comment">// If a initial channel view, extract parameter from the Channel publish config map</em>
<a name="742" href="#742">742</a>                         Map publishConfig = channel.getPublishConfig();
<a name="743" href="#743">743</a>                         <strong class="jxr_keyword">if</strong> (publishConfig != <strong class="jxr_keyword">null</strong>) {
<a name="744" href="#744">744</a>                             publishUrl =
<a name="745" href="#745">745</a>                                 (String) publishConfig.get(
<a name="746" href="#746">746</a>                                     BloggerPublisher.PROP_PUBLISHER_URL);
<a name="747" href="#747">747</a>                             blogId =
<a name="748" href="#748">748</a>                                 (String) publishConfig.get(
<a name="749" href="#749">749</a>                                     BloggerPublisher.PROP_BLOG_ID);
<a name="750" href="#750">750</a>                             userName =
<a name="751" href="#751">751</a>                                 (String) publishConfig.get(
<a name="752" href="#752">752</a>                                     BloggerPublisher.PROP_USERNAME);
<a name="753" href="#753">753</a>                             password =
<a name="754" href="#754">754</a>                                 (String) publishConfig.get(
<a name="755" href="#755">755</a>                                     BloggerPublisher.PROP_PASSWORD);
<a name="756" href="#756">756</a>                             <strong class="jxr_keyword">if</strong> (password != <strong class="jxr_keyword">null</strong>)
<a name="757" href="#757">757</a>                                 password = PASSWORD_MAGIC_KEY;
<a name="758" href="#758">758</a>                             String autoPublishStr =
<a name="759" href="#759">759</a>                                 (String) publishConfig.get(
<a name="760" href="#760">760</a>                                     BloggerPublisher.PROP_PUBLISH);
<a name="761" href="#761">761</a>                             autoPublish =
<a name="762" href="#762">762</a>                                 (autoPublishStr != <strong class="jxr_keyword">null</strong>
<a name="763" href="#763">763</a>                                     &amp;&amp; autoPublishStr.equals(<span class="jxr_string">"false"</span>))
<a name="764" href="#764">764</a>                                     ? false
<a name="765" href="#765">765</a>                                     : <strong class="jxr_keyword">true</strong>;
<a name="766" href="#766">766</a>                         }
<a name="767" href="#767">767</a>                     }
<a name="768" href="#768">768</a> 
<a name="769" href="#769">769</a>                     <em class="jxr_comment">// Make sure that everything has a value, especially if publish has just been enabled</em>
<a name="770" href="#770">770</a>                     <strong class="jxr_keyword">if</strong> (publishUrl == <strong class="jxr_keyword">null</strong>)
<a name="771" href="#771">771</a>                         publishUrl = <span class="jxr_string">"http://plant.blogger.com/api/RPC2"</span>;
<a name="772" href="#772">772</a>                     <strong class="jxr_keyword">if</strong> (blogId == <strong class="jxr_keyword">null</strong>)
<a name="773" href="#773">773</a>                         blogId = <span class="jxr_string">""</span>;
<a name="774" href="#774">774</a>                     <strong class="jxr_keyword">if</strong> (userName == <strong class="jxr_keyword">null</strong>)
<a name="775" href="#775">775</a>                         userName = <span class="jxr_string">""</span>;
<a name="776" href="#776">776</a>                     <strong class="jxr_keyword">if</strong> (password == <strong class="jxr_keyword">null</strong>)
<a name="777" href="#777">777</a>                         password = <span class="jxr_string">""</span>;
<a name="778" href="#778">778</a> 
<a name="779" href="#779">779</a>                     writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;URL&lt;/td&gt;"</span>);
<a name="780" href="#780">780</a>                     writer.write(
<a name="781" href="#781">781</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="782" href="#782">782</a>                             + BloggerPublisher.PROP_PUBLISHER_URL
<a name="783" href="#783">783</a>                             + <span class="jxr_string">"' type='text' size='64' value='"</span>
<a name="784" href="#784">784</a>                             + HTMLHelper.escapeString(publishUrl)
<a name="785" href="#785">785</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="786" href="#786">786</a> 
<a name="787" href="#787">787</a>                     writer.write(
<a name="788" href="#788">788</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Blog Id&lt;/td&gt;"</span>);
<a name="789" href="#789">789</a>                     writer.write(
<a name="790" href="#790">790</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="791" href="#791">791</a>                             + BloggerPublisher.PROP_BLOG_ID
<a name="792" href="#792">792</a>                             + <span class="jxr_string">"' type='text' value='"</span>
<a name="793" href="#793">793</a>                             + HTMLHelper.escapeString(blogId)
<a name="794" href="#794">794</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="795" href="#795">795</a> 
<a name="796" href="#796">796</a>                     writer.write(
<a name="797" href="#797">797</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Username&lt;/td&gt;"</span>);
<a name="798" href="#798">798</a>                     writer.write(
<a name="799" href="#799">799</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="800" href="#800">800</a>                             + BloggerPublisher.PROP_USERNAME
<a name="801" href="#801">801</a>                             + <span class="jxr_string">"' type='text' value='"</span>
<a name="802" href="#802">802</a>                             + HTMLHelper.escapeString(userName)
<a name="803" href="#803">803</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="804" href="#804">804</a> 
<a name="805" href="#805">805</a>                     writer.write(
<a name="806" href="#806">806</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Password&lt;/td&gt;"</span>);
<a name="807" href="#807">807</a>                     writer.write(
<a name="808" href="#808">808</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="809" href="#809">809</a>                             + BloggerPublisher.PROP_PASSWORD
<a name="810" href="#810">810</a>                             + <span class="jxr_string">"' type='password' value='"</span>
<a name="811" href="#811">811</a>                             + HTMLHelper.escapeString(password)
<a name="812" href="#812">812</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="813" href="#813">813</a> 
<a name="814" href="#814">814</a>                     writer.write(
<a name="815" href="#815">815</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Auto Publish&lt;/td&gt;"</span>);
<a name="816" href="#816">816</a>                     writer.write(
<a name="817" href="#817">817</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="818" href="#818">818</a>                             + BloggerPublisher.PROP_PUBLISH
<a name="819" href="#819">819</a>                             + <span class="jxr_string">"' type='checkbox' value='true' "</span>
<a name="820" href="#820">820</a>                             + (autoPublish ? <span class="jxr_string">"checked"</span> : <span class="jxr_string">""</span>)
<a name="821" href="#821">821</a>                             + <span class="jxr_string">"&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="822" href="#822">822</a> 
<a name="823" href="#823">823</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (publishAPI.equals(<span class="jxr_string">"metaweblog"</span>)) {
<a name="824" href="#824">824</a>                     String publishUrl = <strong class="jxr_keyword">null</strong>;
<a name="825" href="#825">825</a>                     String blogId = <strong class="jxr_keyword">null</strong>;
<a name="826" href="#826">826</a>                     String userName = <strong class="jxr_keyword">null</strong>;
<a name="827" href="#827">827</a>                     String password = <strong class="jxr_keyword">null</strong>;
<a name="828" href="#828">828</a>                     <strong class="jxr_keyword">boolean</strong> autoPublish = <strong class="jxr_keyword">true</strong>;
<a name="829" href="#829">829</a> 
<a name="830" href="#830">830</a>                     <strong class="jxr_keyword">if</strong> (refresh) {
<a name="831" href="#831">831</a>                         <em class="jxr_comment">// If a refresh, get the parameter values from the parameter collection</em>
<a name="832" href="#832">832</a>                         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"publishapichange"</span>) == <strong class="jxr_keyword">null</strong>) {
<a name="833" href="#833">833</a>                             publishUrl =
<a name="834" href="#834">834</a>                                 request.getParameter(
<a name="835" href="#835">835</a>                                     MetaWeblogPublisher.PROP_PUBLISHER_URL);
<a name="836" href="#836">836</a>                         }
<a name="837" href="#837">837</a>                         blogId =
<a name="838" href="#838">838</a>                             (String) request.getParameter(
<a name="839" href="#839">839</a>                                 BloggerPublisher.PROP_BLOG_ID);
<a name="840" href="#840">840</a>                         <strong class="jxr_keyword">if</strong> (blogId != <strong class="jxr_keyword">null</strong> &amp;&amp; blogId.length() == 0)
<a name="841" href="#841">841</a>                             blogId = <span class="jxr_string">"home"</span>;
<a name="842" href="#842">842</a> 
<a name="843" href="#843">843</a>                         userName =
<a name="844" href="#844">844</a>                             (String) request.getParameter(
<a name="845" href="#845">845</a>                                 MetaWeblogPublisher.PROP_USERNAME);
<a name="846" href="#846">846</a>                         password =
<a name="847" href="#847">847</a>                             (String) request.getParameter(
<a name="848" href="#848">848</a>                                 MetaWeblogPublisher.PROP_PASSWORD);
<a name="849" href="#849">849</a>                         String autoPublishStr =
<a name="850" href="#850">850</a>                             request.getParameter(
<a name="851" href="#851">851</a>                                 MetaWeblogPublisher.PROP_PUBLISH);
<a name="852" href="#852">852</a>                         autoPublish =
<a name="853" href="#853">853</a>                             (autoPublishStr != <strong class="jxr_keyword">null</strong>
<a name="854" href="#854">854</a>                                 &amp;&amp; autoPublishStr.equals(<span class="jxr_string">"false"</span>))
<a name="855" href="#855">855</a>                                 ? false
<a name="856" href="#856">856</a>                                 : <strong class="jxr_keyword">true</strong>;
<a name="857" href="#857">857</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="858" href="#858">858</a>                         <em class="jxr_comment">// If a initial channel view, extract parameter from the Channel publish config map</em>
<a name="859" href="#859">859</a>                         Map publishConfig = channel.getPublishConfig();
<a name="860" href="#860">860</a>                         <strong class="jxr_keyword">if</strong> (publishConfig != <strong class="jxr_keyword">null</strong>) {
<a name="861" href="#861">861</a>                             publishUrl =
<a name="862" href="#862">862</a>                                 (String) publishConfig.get(
<a name="863" href="#863">863</a>                                     MetaWeblogPublisher.PROP_PUBLISHER_URL);
<a name="864" href="#864">864</a>                             userName =
<a name="865" href="#865">865</a>                                 (String) publishConfig.get(
<a name="866" href="#866">866</a>                                     MetaWeblogPublisher.PROP_USERNAME);
<a name="867" href="#867">867</a>                             password =
<a name="868" href="#868">868</a>                                 (String) publishConfig.get(
<a name="869" href="#869">869</a>                                     MetaWeblogPublisher.PROP_PASSWORD);
<a name="870" href="#870">870</a>                             <strong class="jxr_keyword">if</strong> (password != <strong class="jxr_keyword">null</strong>)
<a name="871" href="#871">871</a>                                 password = PASSWORD_MAGIC_KEY;
<a name="872" href="#872">872</a>                             String autoPublishStr =
<a name="873" href="#873">873</a>                                 (String) publishConfig.get(
<a name="874" href="#874">874</a>                                     MetaWeblogPublisher.PROP_PUBLISH);
<a name="875" href="#875">875</a>                             autoPublish =
<a name="876" href="#876">876</a>                                 (autoPublishStr != <strong class="jxr_keyword">null</strong>
<a name="877" href="#877">877</a>                                     &amp;&amp; autoPublishStr.equals(<span class="jxr_string">"false"</span>))
<a name="878" href="#878">878</a>                                     ? false
<a name="879" href="#879">879</a>                                     : <strong class="jxr_keyword">true</strong>;
<a name="880" href="#880">880</a>                         }
<a name="881" href="#881">881</a>                     }
<a name="882" href="#882">882</a> 
<a name="883" href="#883">883</a>                     <em class="jxr_comment">// Make sure that everything has a value, especially if publish has just been enabled</em>
<a name="884" href="#884">884</a>                     <strong class="jxr_keyword">if</strong> (publishUrl == <strong class="jxr_keyword">null</strong>)
<a name="885" href="#885">885</a>                         publishUrl = <span class="jxr_string">"http://127.0.0.1:5335/RPC2"</span>;
<a name="886" href="#886">886</a>                     <strong class="jxr_keyword">if</strong> (blogId == <strong class="jxr_keyword">null</strong>)
<a name="887" href="#887">887</a>                         blogId = <span class="jxr_string">"home"</span>;
<a name="888" href="#888">888</a>                     <strong class="jxr_keyword">if</strong> (userName == <strong class="jxr_keyword">null</strong>)
<a name="889" href="#889">889</a>                         userName = <span class="jxr_string">""</span>;
<a name="890" href="#890">890</a>                     <strong class="jxr_keyword">if</strong> (password == <strong class="jxr_keyword">null</strong>)
<a name="891" href="#891">891</a>                         password = <span class="jxr_string">""</span>;
<a name="892" href="#892">892</a> 
<a name="893" href="#893">893</a>                     writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;URL&lt;/td&gt;"</span>);
<a name="894" href="#894">894</a>                     writer.write(
<a name="895" href="#895">895</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="896" href="#896">896</a>                             + MetaWeblogPublisher.PROP_PUBLISHER_URL
<a name="897" href="#897">897</a>                             + <span class="jxr_string">"' type='text' size='64' value='"</span>
<a name="898" href="#898">898</a>                             + HTMLHelper.escapeString(publishUrl)
<a name="899" href="#899">899</a>                             + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;Ensure that the URL points to your MetaWeblog (e.g. Radio Userland) host&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="900" href="#900">900</a> 
<a name="901" href="#901">901</a>                     writer.write(
<a name="902" href="#902">902</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Blog Id&lt;/td&gt;"</span>);
<a name="903" href="#903">903</a>                     writer.write(
<a name="904" href="#904">904</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="905" href="#905">905</a>                             + BloggerPublisher.PROP_BLOG_ID
<a name="906" href="#906">906</a>                             + <span class="jxr_string">"' type='text' value='"</span>
<a name="907" href="#907">907</a>                             + HTMLHelper.escapeString(blogId)
<a name="908" href="#908">908</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="909" href="#909">909</a> 
<a name="910" href="#910">910</a>                     writer.write(
<a name="911" href="#911">911</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Username&lt;/td&gt;"</span>);
<a name="912" href="#912">912</a>                     writer.write(
<a name="913" href="#913">913</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="914" href="#914">914</a>                             + MetaWeblogPublisher.PROP_USERNAME
<a name="915" href="#915">915</a>                             + <span class="jxr_string">"' type='text' value='"</span>
<a name="916" href="#916">916</a>                             + HTMLHelper.escapeString(userName)
<a name="917" href="#917">917</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="918" href="#918">918</a> 
<a name="919" href="#919">919</a>                     writer.write(
<a name="920" href="#920">920</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Password&lt;/td&gt;"</span>);
<a name="921" href="#921">921</a>                     writer.write(
<a name="922" href="#922">922</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="923" href="#923">923</a>                             + MetaWeblogPublisher.PROP_PASSWORD
<a name="924" href="#924">924</a>                             + <span class="jxr_string">"' type='password' value='"</span>
<a name="925" href="#925">925</a>                             + HTMLHelper.escapeString(password)
<a name="926" href="#926">926</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="927" href="#927">927</a> 
<a name="928" href="#928">928</a>                     writer.write(
<a name="929" href="#929">929</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Auto Publish&lt;/td&gt;"</span>);
<a name="930" href="#930">930</a>                     writer.write(
<a name="931" href="#931">931</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="932" href="#932">932</a>                             + MetaWeblogPublisher.PROP_PUBLISH
<a name="933" href="#933">933</a>                             + <span class="jxr_string">"' type='checkbox' value='true' "</span>
<a name="934" href="#934">934</a>                             + (autoPublish ? <span class="jxr_string">"checked"</span> : <span class="jxr_string">""</span>)
<a name="935" href="#935">935</a>                             + <span class="jxr_string">"&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="936" href="#936">936</a> 
<a name="937" href="#937">937</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (publishAPI.equals(<span class="jxr_string">"livejournal"</span>)) {
<a name="938" href="#938">938</a>                     String publishUrl = <strong class="jxr_keyword">null</strong>;
<a name="939" href="#939">939</a>                     String userName = <strong class="jxr_keyword">null</strong>;
<a name="940" href="#940">940</a>                     String password = <strong class="jxr_keyword">null</strong>;
<a name="941" href="#941">941</a> 
<a name="942" href="#942">942</a>                     <strong class="jxr_keyword">if</strong> (refresh) {
<a name="943" href="#943">943</a>                         <em class="jxr_comment">// If a refresh, get the parameter values from the parameter collection</em>
<a name="944" href="#944">944</a>                         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"publishapichange"</span>) == <strong class="jxr_keyword">null</strong>) {
<a name="945" href="#945">945</a>                             publishUrl =
<a name="946" href="#946">946</a>                                 request.getParameter(
<a name="947" href="#947">947</a>                                     LiveJournalPublisher.PROP_PUBLISHER_URL);
<a name="948" href="#948">948</a>                         }
<a name="949" href="#949">949</a>                         userName =
<a name="950" href="#950">950</a>                             (String) request.getParameter(
<a name="951" href="#951">951</a>                                 LiveJournalPublisher.PROP_USERNAME);
<a name="952" href="#952">952</a>                         password =
<a name="953" href="#953">953</a>                             (String) request.getParameter(
<a name="954" href="#954">954</a>                                 LiveJournalPublisher.PROP_PASSWORD);
<a name="955" href="#955">955</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="956" href="#956">956</a>                         <em class="jxr_comment">// If a initial channel view, extract parameter from the Channel publish config map</em>
<a name="957" href="#957">957</a>                         Map publishConfig = channel.getPublishConfig();
<a name="958" href="#958">958</a>                         <strong class="jxr_keyword">if</strong> (publishConfig != <strong class="jxr_keyword">null</strong>) {
<a name="959" href="#959">959</a>                             publishUrl =
<a name="960" href="#960">960</a>                                 (String) publishConfig.get(
<a name="961" href="#961">961</a>                                     LiveJournalPublisher.PROP_PUBLISHER_URL);
<a name="962" href="#962">962</a>                             userName =
<a name="963" href="#963">963</a>                                 (String) publishConfig.get(
<a name="964" href="#964">964</a>                                     LiveJournalPublisher.PROP_USERNAME);
<a name="965" href="#965">965</a>                             password =
<a name="966" href="#966">966</a>                                 (String) publishConfig.get(
<a name="967" href="#967">967</a>                                     LiveJournalPublisher.PROP_PASSWORD);
<a name="968" href="#968">968</a>                             <strong class="jxr_keyword">if</strong> (password != <strong class="jxr_keyword">null</strong>)
<a name="969" href="#969">969</a>                                 password = PASSWORD_MAGIC_KEY;
<a name="970" href="#970">970</a>                         }
<a name="971" href="#971">971</a>                     }
<a name="972" href="#972">972</a> 
<a name="973" href="#973">973</a>                     <em class="jxr_comment">// Make sure that everything has a value, especially if publish has just been enabled</em>
<a name="974" href="#974">974</a>                     <strong class="jxr_keyword">if</strong> (publishUrl == <strong class="jxr_keyword">null</strong>)
<a name="975" href="#975">975</a>                         publishUrl =
<a name="976" href="#976">976</a>                             <span class="jxr_string">"http://www.livejournal.com/interface/xmlrpc"</span>;
<a name="977" href="#977">977</a>                     <strong class="jxr_keyword">if</strong> (userName == <strong class="jxr_keyword">null</strong>)
<a name="978" href="#978">978</a>                         userName = <span class="jxr_string">""</span>;
<a name="979" href="#979">979</a>                     <strong class="jxr_keyword">if</strong> (password == <strong class="jxr_keyword">null</strong>)
<a name="980" href="#980">980</a>                         password = <span class="jxr_string">""</span>;
<a name="981" href="#981">981</a> 
<a name="982" href="#982">982</a>                     writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;URL&lt;/td&gt;"</span>);
<a name="983" href="#983">983</a>                     writer.write(
<a name="984" href="#984">984</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="985" href="#985">985</a>                             + LiveJournalPublisher.PROP_PUBLISHER_URL
<a name="986" href="#986">986</a>                             + <span class="jxr_string">"' type='text' size='64' value='"</span>
<a name="987" href="#987">987</a>                             + HTMLHelper.escapeString(publishUrl)
<a name="988" href="#988">988</a>                             + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="989" href="#989">989</a> 
<a name="990" href="#990">990</a>                     writer.write(
<a name="991" href="#991">991</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Username&lt;/td&gt;"</span>);
<a name="992" href="#992">992</a>                     writer.write(
<a name="993" href="#993">993</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="994" href="#994">994</a>                             + LiveJournalPublisher.PROP_USERNAME
<a name="995" href="#995">995</a>                             + <span class="jxr_string">"' type='text' value='"</span>
<a name="996" href="#996">996</a>                             + HTMLHelper.escapeString(userName)
<a name="997" href="#997">997</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="998" href="#998">998</a> 
<a name="999" href="#999">999</a>                     writer.write(
<a name="1000" href="#1000">1000</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Password&lt;/td&gt;"</span>);
<a name="1001" href="#1001">1001</a>                     writer.write(
<a name="1002" href="#1002">1002</a>                         <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input name='"</span>
<a name="1003" href="#1003">1003</a>                             + LiveJournalPublisher.PROP_PASSWORD
<a name="1004" href="#1004">1004</a>                             + <span class="jxr_string">"' type='password' value='"</span>
<a name="1005" href="#1005">1005</a>                             + HTMLHelper.escapeString(password)
<a name="1006" href="#1006">1006</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1007" href="#1007">1007</a> 
<a name="1008" href="#1008">1008</a>                 }
<a name="1009" href="#1009">1009</a>             }
<a name="1010" href="#1010">1010</a> 
<a name="1011" href="#1011">1011</a>             writer.write(
<a name="1012" href="#1012">1012</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' name='update' value='Update'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;input type='submit' name='delete' onClick='return confirm(\&quot;Are you sure you want to delete this channel?\&quot;);' value='Delete'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1013" href="#1013">1013</a>             writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="1014" href="#1014">1014</a>             writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="1015" href="#1015">1015</a>         }
<a name="1016" href="#1016">1016</a>     }
<a name="1017" href="#1017">1017</a> 
<a name="1018" href="#1018">1018</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeCategory(
<a name="1019" href="#1019">1019</a>         Writer writer,
<a name="1020" href="#1020">1020</a>         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category)
<a name="1021" href="#1021">1021</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="1022" href="#1022">1022</a>         <strong class="jxr_keyword">if</strong> (category == <strong class="jxr_keyword">null</strong>) {
<a name="1023" href="#1023">1023</a>             writer.write(
<a name="1024" href="#1024">1024</a>                 <span class="jxr_string">"&lt;b&gt;Category "</span> + category.getName() + <span class="jxr_string">" not found!&lt;/b&gt;"</span>);
<a name="1025" href="#1025">1025</a>         } <strong class="jxr_keyword">else</strong> {
<a name="1026" href="#1026">1026</a>             writer.write(
<a name="1027" href="#1027">1027</a>                 <span class="jxr_string">"&lt;form name='category' action='?action=categoryupdate' method='POST'&gt;"</span>);
<a name="1028" href="#1028">1028</a>             writer.write(
<a name="1029" href="#1029">1029</a>                 <span class="jxr_string">"&lt;input type='hidden' name='name' value='"</span>
<a name="1030" href="#1030">1030</a>                     + HTMLHelper.escapeString(category.getName())
<a name="1031" href="#1031">1031</a>                     + <span class="jxr_string">"'&gt;"</span>);
<a name="1032" href="#1032">1032</a>             writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="1033" href="#1033">1033</a>             writer.write(
<a name="1034" href="#1034">1034</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;th class='tableHead' colspan='2'&gt;Category Configuration&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="1035" href="#1035">1035</a>             writer.write(
<a name="1036" href="#1036">1036</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Newsgroup Name&lt;/td&gt;&lt;td class='row2'&gt;"</span>
<a name="1037" href="#1037">1037</a>                     + HTMLHelper.escapeString(category.getName())
<a name="1038" href="#1038">1038</a>                     + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1039" href="#1039">1039</a>             writer.write(
<a name="1040" href="#1040">1040</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Linked Channels&lt;/td&gt;"</span>
<a name="1041" href="#1041">1041</a>                     + <span class="jxr_string">"&lt;td class='row2'&gt;"</span>);
<a name="1042" href="#1042">1042</a> 
<a name="1043" href="#1043">1043</a>             Iterator channelIter = category.getChannels().values().iterator();
<a name="1044" href="#1044">1044</a>             Set channelNames = <strong class="jxr_keyword">new</strong> TreeSet();
<a name="1045" href="#1045">1045</a>             <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="1046" href="#1046">1046</a>                 <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = (Channel) channelIter.next();
<a name="1047" href="#1047">1047</a>                 channelNames.add(channel.getName());
<a name="1048" href="#1048">1048</a>             }
<a name="1049" href="#1049">1049</a> 
<a name="1050" href="#1050">1050</a>             channelIter = channelNames.iterator();
<a name="1051" href="#1051">1051</a>             <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="1052" href="#1052">1052</a>                 String channelName = (String) channelIter.next();
<a name="1053" href="#1053">1053</a>                 writer.write(
<a name="1054" href="#1054">1054</a>                     <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=show&amp;name="</span>
<a name="1055" href="#1055">1055</a>                         + URLEncoder.encode(channelName)
<a name="1056" href="#1056">1056</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="1057" href="#1057">1057</a>                         + HTMLHelper.escapeString(channelName)
<a name="1058" href="#1058">1058</a>                         + <span class="jxr_string">"&lt;/a&gt;&lt;br&gt;"</span>);
<a name="1059" href="#1059">1059</a>             }
<a name="1060" href="#1060">1060</a> 
<a name="1061" href="#1061">1061</a>             writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1062" href="#1062">1062</a> 
<a name="1063" href="#1063">1063</a>             <strong class="jxr_keyword">if</strong> (category.getChannels().size() == 0) {
<a name="1064" href="#1064">1064</a>                 writer.write(
<a name="1065" href="#1065">1065</a>                     <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' name='delete' onClick='return confirm(\&quot;Are you sure you want to delete this category?\&quot;);' value='Delete'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1066" href="#1066">1066</a>             } <strong class="jxr_keyword">else</strong> {
<a name="1067" href="#1067">1067</a>                 writer.write(
<a name="1068" href="#1068">1068</a>                     <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;Please disassociate channels from category to enable category deletion.&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1069" href="#1069">1069</a>             }
<a name="1070" href="#1070">1070</a>             writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="1071" href="#1071">1071</a>             writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="1072" href="#1072">1072</a>         }
<a name="1073" href="#1073">1073</a>     }
<a name="1074" href="#1074">1074</a> 
<a name="1075" href="#1075">1075</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeExpiration(Writer writer, <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel)
<a name="1076" href="#1076">1076</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="1077" href="#1077">1077</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Expiration&lt;/td&gt;"</span>);
<a name="1078" href="#1078">1078</a>         writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='expiration'&gt;"</span>);
<a name="1079" href="#1079">1079</a> 
<a name="1080" href="#1080">1080</a>         <strong class="jxr_keyword">long</strong> expiration = channel.getExpiration();
<a name="1081" href="#1081">1081</a> 
<a name="1082" href="#1082">1082</a>         writeOption(
<a name="1083" href="#1083">1083</a>             writer,
<a name="1084" href="#1084">1084</a>             <span class="jxr_string">"Keep all items"</span>,
<a name="1085" href="#1085">1085</a>             Channel.EXPIRATION_KEEP,
<a name="1086" href="#1086">1086</a>             expiration);
<a name="1087" href="#1087">1087</a>         writeOption(writer, <span class="jxr_string">"Keep only current items"</span>, 0, expiration);
<a name="1088" href="#1088">1088</a>         writeOption(
<a name="1089" href="#1089">1089</a>             writer,
<a name="1090" href="#1090">1090</a>             <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="1091" href="#1091">1091</a>             (1000L * 60 * 60 * 24 * 1),
<a name="1092" href="#1092">1092</a>             expiration);
<a name="1093" href="#1093">1093</a>         writeOption(
<a name="1094" href="#1094">1094</a>             writer,
<a name="1095" href="#1095">1095</a>             <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="1096" href="#1096">1096</a>             (1000L * 60 * 60 * 24 * 2),
<a name="1097" href="#1097">1097</a>             expiration);
<a name="1098" href="#1098">1098</a>         writeOption(
<a name="1099" href="#1099">1099</a>             writer,
<a name="1100" href="#1100">1100</a>             <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="1101" href="#1101">1101</a>             (1000L * 60 * 60 * 24 * 4),
<a name="1102" href="#1102">1102</a>             expiration);
<a name="1103" href="#1103">1103</a>         writeOption(
<a name="1104" href="#1104">1104</a>             writer,
<a name="1105" href="#1105">1105</a>             <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="1106" href="#1106">1106</a>             (1000L * 60 * 60 * 24 * 7),
<a name="1107" href="#1107">1107</a>             expiration);
<a name="1108" href="#1108">1108</a>         writeOption(
<a name="1109" href="#1109">1109</a>             writer,
<a name="1110" href="#1110">1110</a>             <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="1111" href="#1111">1111</a>             (1000L * 60 * 60 * 24 * 14),
<a name="1112" href="#1112">1112</a>             expiration);
<a name="1113" href="#1113">1113</a>         writeOption(
<a name="1114" href="#1114">1114</a>             writer,
<a name="1115" href="#1115">1115</a>             <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="1116" href="#1116">1116</a>             (1000L * 60 * 60 * 24 * 28),
<a name="1117" href="#1117">1117</a>             expiration);
<a name="1118" href="#1118">1118</a> 
<a name="1119" href="#1119">1119</a> 		writeOption(
<a name="1120" href="#1120">1120</a> 			writer,
<a name="1121" href="#1121">1121</a> 			<span class="jxr_string">"Keep items for 6 months"</span>,
<a name="1122" href="#1122">1122</a> 			((1000L * 60 * 60 * 24) * 180),
<a name="1123" href="#1123">1123</a> 			expiration);
<a name="1124" href="#1124">1124</a> 
<a name="1125" href="#1125">1125</a> 		writeOption(
<a name="1126" href="#1126">1126</a> 			writer,
<a name="1127" href="#1127">1127</a> 			<span class="jxr_string">"Keep items for 1 year"</span>,
<a name="1128" href="#1128">1128</a> 			((1000L * 60 * 60 * 24) * 365),
<a name="1129" href="#1129">1129</a> 			expiration);
<a name="1130" href="#1130">1130</a> 
<a name="1131" href="#1131">1131</a>         writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1132" href="#1132">1132</a>     }
<a name="1133" href="#1133">1133</a> 
<a name="1134" href="#1134">1134</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeOption(
<a name="1135" href="#1135">1135</a>         Writer writer,
<a name="1136" href="#1136">1136</a>         String option,
<a name="1137" href="#1137">1137</a>         <strong class="jxr_keyword">long</strong> value,
<a name="1138" href="#1138">1138</a>         <strong class="jxr_keyword">long</strong> selectedValue)
<a name="1139" href="#1139">1139</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="1140" href="#1140">1140</a>         <strong class="jxr_keyword">if</strong> (value == selectedValue) {
<a name="1141" href="#1141">1141</a>             writer.write(
<a name="1142" href="#1142">1142</a>                 <span class="jxr_string">"&lt;option selected value='"</span> + value + <span class="jxr_string">"'&gt;"</span> + option + <span class="jxr_string">"\n"</span>);
<a name="1143" href="#1143">1143</a>         } <strong class="jxr_keyword">else</strong> {
<a name="1144" href="#1144">1144</a>             writer.write(<span class="jxr_string">"&lt;option value='"</span> + value + <span class="jxr_string">"'&gt;"</span> + option + <span class="jxr_string">"\n"</span>);
<a name="1145" href="#1145">1145</a>         }
<a name="1146" href="#1146">1146</a>     }
<a name="1147" href="#1147">1147</a> 
<a name="1148" href="#1148">1148</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeOption(
<a name="1149" href="#1149">1149</a>         StringBuffer buffer,
<a name="1150" href="#1150">1150</a>         String option,
<a name="1151" href="#1151">1151</a>         <strong class="jxr_keyword">long</strong> value,
<a name="1152" href="#1152">1152</a>         <strong class="jxr_keyword">long</strong> selectedValue)
<a name="1153" href="#1153">1153</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="1154" href="#1154">1154</a>         <strong class="jxr_keyword">if</strong> (value == selectedValue) {
<a name="1155" href="#1155">1155</a>             buffer.append(
<a name="1156" href="#1156">1156</a>                 <span class="jxr_string">"&lt;option selected value='"</span> + value + <span class="jxr_string">"'&gt;"</span> + option + <span class="jxr_string">"\n"</span>);
<a name="1157" href="#1157">1157</a>         } <strong class="jxr_keyword">else</strong> {
<a name="1158" href="#1158">1158</a>             buffer.append(<span class="jxr_string">"&lt;option value='"</span> + value + <span class="jxr_string">"'&gt;"</span> + option + <span class="jxr_string">"\n"</span>);
<a name="1159" href="#1159">1159</a>         }
<a name="1160" href="#1160">1160</a>     }
<a name="1161" href="#1161">1161</a> 
<a name="1162" href="#1162">1162</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdShowChannel(
<a name="1163" href="#1163">1163</a>         HttpServletRequest request,
<a name="1164" href="#1164">1164</a>         HttpServletResponse response)
<a name="1165" href="#1165">1165</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1166" href="#1166">1166</a> 
<a name="1167" href="#1167">1167</a>         Writer writer = response.getWriter();
<a name="1168" href="#1168">1168</a>         writeHeader(writer, TAB_VIEW_CHANNELS);
<a name="1169" href="#1169">1169</a> 
<a name="1170" href="#1170">1170</a>         String channelName = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="1171" href="#1171">1171</a> 
<a name="1172" href="#1172">1172</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1173" href="#1173">1173</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1174" href="#1174">1174</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1175" href="#1175">1175</a>         <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="1176" href="#1176">1176</a>         writeChannel(writer, channel, request, false);
<a name="1177" href="#1177">1177</a> 
<a name="1178" href="#1178">1178</a>         writeFooter(writer);
<a name="1179" href="#1179">1179</a>     }
<a name="1180" href="#1180">1180</a> 
<a name="1181" href="#1181">1181</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdShowCategory(
<a name="1182" href="#1182">1182</a>         HttpServletRequest request,
<a name="1183" href="#1183">1183</a>         HttpServletResponse response)
<a name="1184" href="#1184">1184</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1185" href="#1185">1185</a> 
<a name="1186" href="#1186">1186</a>         Writer writer = response.getWriter();
<a name="1187" href="#1187">1187</a>         writeHeader(writer, TAB_VIEW_CATEGORIES);
<a name="1188" href="#1188">1188</a> 
<a name="1189" href="#1189">1189</a>         String categoryName = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="1190" href="#1190">1190</a> 
<a name="1191" href="#1191">1191</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1192" href="#1192">1192</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1193" href="#1193">1193</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1194" href="#1194">1194</a>         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = channelManager.categoryByName(categoryName);
<a name="1195" href="#1195">1195</a>         writeCategory(writer, category);
<a name="1196" href="#1196">1196</a>         writeFooter(writer);
<a name="1197" href="#1197">1197</a>     }
<a name="1198" href="#1198">1198</a> 
<a name="1199" href="#1199">1199</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdUpdateChannel(
<a name="1200" href="#1200">1200</a>         HttpServletRequest request,
<a name="1201" href="#1201">1201</a>         HttpServletResponse response)
<a name="1202" href="#1202">1202</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1203" href="#1203">1203</a> 
<a name="1204" href="#1204">1204</a>         Writer writer = response.getWriter();
<a name="1205" href="#1205">1205</a>         writeHeader(writer, TAB_VIEW_CHANNELS);
<a name="1206" href="#1206">1206</a> 
<a name="1207" href="#1207">1207</a>         String channelName = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="1208" href="#1208">1208</a> 
<a name="1209" href="#1209">1209</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1210" href="#1210">1210</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1211" href="#1211">1211</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1212" href="#1212">1212</a> 
<a name="1213" href="#1213">1213</a>         <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="1214" href="#1214">1214</a> 
<a name="1215" href="#1215">1215</a>         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"update"</span>) != <strong class="jxr_keyword">null</strong>) {
<a name="1216" href="#1216">1216</a>             <em class="jxr_comment">// Update channel.</em>
<a name="1217" href="#1217">1217</a>             String urlString = request.getParameter(<span class="jxr_string">"URL"</span>);
<a name="1218" href="#1218">1218</a>             List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="1219" href="#1219">1219</a>             <strong class="jxr_keyword">if</strong> (urlString.length() == 0) {
<a name="1220" href="#1220">1220</a>                 errors.add(<span class="jxr_string">"URL cannot be empty"</span>);
<a name="1221" href="#1221">1221</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="1222" href="#1222">1222</a>                 urlString.equals(<span class="jxr_string">"http://"</span>) || urlString.equals(<span class="jxr_string">"https://"</span>)) {
<a name="1223" href="#1223">1223</a>                 errors.add(<span class="jxr_string">"You must specify a URL"</span>);
<a name="1224" href="#1224">1224</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="1225" href="#1225">1225</a>                 !urlString.startsWith(<span class="jxr_string">"http://"</span>)
<a name="1226" href="#1226">1226</a>                     &amp;&amp; !urlString.startsWith(<span class="jxr_string">"https://"</span>)) {
<a name="1227" href="#1227">1227</a>                 errors.add(
<a name="1228" href="#1228">1228</a>                     <span class="jxr_string">"Only URLs starting http:// or https:// are supported"</span>);
<a name="1229" href="#1229">1229</a>             }
<a name="1230" href="#1230">1230</a> 
<a name="1231" href="#1231">1231</a>             <strong class="jxr_keyword">boolean</strong> postingEnabled =
<a name="1232" href="#1232">1232</a>                 request.getParameter(<span class="jxr_string">"postingEnabled"</span>).equalsIgnoreCase(<span class="jxr_string">"true"</span>);
<a name="1233" href="#1233">1233</a>             String publishAPI = <strong class="jxr_keyword">null</strong>;
<a name="1234" href="#1234">1234</a>             Map publishConfig = <strong class="jxr_keyword">null</strong>;
<a name="1235" href="#1235">1235</a>             <strong class="jxr_keyword">if</strong> (postingEnabled) {
<a name="1236" href="#1236">1236</a>                 publishConfig = <strong class="jxr_keyword">new</strong> HashMap();
<a name="1237" href="#1237">1237</a>                 publishAPI = request.getParameter(<span class="jxr_string">"publishAPI"</span>);
<a name="1238" href="#1238">1238</a> 
<a name="1239" href="#1239">1239</a>                 <em class="jxr_comment">// Validate...</em>
<a name="1240" href="#1240">1240</a>                 <em class="jxr_comment">//TODO: improve componentization / pluggability of publishers</em>
<a name="1241" href="#1241">1241</a>                 <strong class="jxr_keyword">if</strong> (publishAPI.equals(<span class="jxr_string">"blogger"</span>)) {
<a name="1242" href="#1242">1242</a>                     publishConfig.put(
<a name="1243" href="#1243">1243</a>                         BloggerPublisher.PROP_PUBLISHER_URL,
<a name="1244" href="#1244">1244</a>                         request.getParameter(
<a name="1245" href="#1245">1245</a>                             BloggerPublisher.PROP_PUBLISHER_URL));
<a name="1246" href="#1246">1246</a>                     publishConfig.put(
<a name="1247" href="#1247">1247</a>                         BloggerPublisher.PROP_USERNAME,
<a name="1248" href="#1248">1248</a>                         request.getParameter(BloggerPublisher.PROP_USERNAME));
<a name="1249" href="#1249">1249</a> 
<a name="1250" href="#1250">1250</a>                     String password =
<a name="1251" href="#1251">1251</a>                         request.getParameter(BloggerPublisher.PROP_PASSWORD);
<a name="1252" href="#1252">1252</a>                     <strong class="jxr_keyword">if</strong> (password.equals(PASSWORD_MAGIC_KEY)
<a name="1253" href="#1253">1253</a>                         &amp;&amp; (channel.getPublishConfig() != <strong class="jxr_keyword">null</strong>)) {
<a name="1254" href="#1254">1254</a>                         password =
<a name="1255" href="#1255">1255</a>                             (String) channel.getPublishConfig().get(
<a name="1256" href="#1256">1256</a>                                 BloggerPublisher.PROP_PASSWORD);
<a name="1257" href="#1257">1257</a>                     }
<a name="1258" href="#1258">1258</a>                     publishConfig.put(BloggerPublisher.PROP_PASSWORD, password);
<a name="1259" href="#1259">1259</a> 
<a name="1260" href="#1260">1260</a>                     publishConfig.put(
<a name="1261" href="#1261">1261</a>                         BloggerPublisher.PROP_BLOG_ID,
<a name="1262" href="#1262">1262</a>                         request.getParameter(BloggerPublisher.PROP_BLOG_ID));
<a name="1263" href="#1263">1263</a> 
<a name="1264" href="#1264">1264</a>                     String autoPublishStr =
<a name="1265" href="#1265">1265</a>                         (String) request.getParameter(
<a name="1266" href="#1266">1266</a>                             BloggerPublisher.PROP_PUBLISH);
<a name="1267" href="#1267">1267</a>                     <strong class="jxr_keyword">if</strong> (autoPublishStr.equals(<span class="jxr_string">"true"</span>)) {
<a name="1268" href="#1268">1268</a>                         publishConfig.put(
<a name="1269" href="#1269">1269</a>                             BloggerPublisher.PROP_PUBLISH,
<a name="1270" href="#1270">1270</a>                             <span class="jxr_string">"true"</span>);
<a name="1271" href="#1271">1271</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="1272" href="#1272">1272</a>                         publishConfig.put(
<a name="1273" href="#1273">1273</a>                             BloggerPublisher.PROP_PUBLISH,
<a name="1274" href="#1274">1274</a>                             <span class="jxr_string">"false"</span>);
<a name="1275" href="#1275">1275</a>                     }
<a name="1276" href="#1276">1276</a> 
<a name="1277" href="#1277">1277</a>                     <strong class="jxr_keyword">try</strong> {
<a name="1278" href="#1278">1278</a>                         <a href="../../../../org/methodize/nntprss/feed/publish/Publisher.html">Publisher</a> pub = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/publish/BloggerPublisher.html">BloggerPublisher</a>();
<a name="1279" href="#1279">1279</a>                         pub.validate(publishConfig);
<a name="1280" href="#1280">1280</a>                     } <strong class="jxr_keyword">catch</strong> (PublisherException pe) {
<a name="1281" href="#1281">1281</a>                         errors.add(
<a name="1282" href="#1282">1282</a>                             <span class="jxr_string">"Error validating Blogger posting configuration - "</span>
<a name="1283" href="#1283">1283</a>                                 + pe.getMessage());
<a name="1284" href="#1284">1284</a>                         errors.add(
<a name="1285" href="#1285">1285</a>                             <span class="jxr_string">"Check Blogger URL, user name, password, and blog id."</span>);
<a name="1286" href="#1286">1286</a>                     }
<a name="1287" href="#1287">1287</a> 
<a name="1288" href="#1288">1288</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (publishAPI.equals(<span class="jxr_string">"metaweblog"</span>)) {
<a name="1289" href="#1289">1289</a>                     publishConfig.put(
<a name="1290" href="#1290">1290</a>                         MetaWeblogPublisher.PROP_PUBLISHER_URL,
<a name="1291" href="#1291">1291</a>                         request.getParameter(
<a name="1292" href="#1292">1292</a>                             MetaWeblogPublisher.PROP_PUBLISHER_URL));
<a name="1293" href="#1293">1293</a>                     publishConfig.put(
<a name="1294" href="#1294">1294</a>                         MetaWeblogPublisher.PROP_USERNAME,
<a name="1295" href="#1295">1295</a>                         request.getParameter(
<a name="1296" href="#1296">1296</a>                             MetaWeblogPublisher.PROP_USERNAME));
<a name="1297" href="#1297">1297</a> 
<a name="1298" href="#1298">1298</a>                     String password =
<a name="1299" href="#1299">1299</a>                         request.getParameter(MetaWeblogPublisher.PROP_PASSWORD);
<a name="1300" href="#1300">1300</a>                     <strong class="jxr_keyword">if</strong> (password.equals(PASSWORD_MAGIC_KEY)
<a name="1301" href="#1301">1301</a>                         &amp;&amp; (channel.getPublishConfig() != <strong class="jxr_keyword">null</strong>)) {
<a name="1302" href="#1302">1302</a>                         password =
<a name="1303" href="#1303">1303</a>                             (String) channel.getPublishConfig().get(
<a name="1304" href="#1304">1304</a>                                 MetaWeblogPublisher.PROP_PASSWORD);
<a name="1305" href="#1305">1305</a>                     }
<a name="1306" href="#1306">1306</a>                     publishConfig.put(
<a name="1307" href="#1307">1307</a>                         MetaWeblogPublisher.PROP_PASSWORD,
<a name="1308" href="#1308">1308</a>                         password);
<a name="1309" href="#1309">1309</a> 
<a name="1310" href="#1310">1310</a>                     publishConfig.put(
<a name="1311" href="#1311">1311</a>                         MetaWeblogPublisher.PROP_BLOG_ID,
<a name="1312" href="#1312">1312</a>                         request.getParameter(MetaWeblogPublisher.PROP_BLOG_ID));
<a name="1313" href="#1313">1313</a> 
<a name="1314" href="#1314">1314</a>                     String autoPublishStr =
<a name="1315" href="#1315">1315</a>                         (String) request.getParameter(
<a name="1316" href="#1316">1316</a>                             MetaWeblogPublisher.PROP_PUBLISH);
<a name="1317" href="#1317">1317</a>                     <strong class="jxr_keyword">if</strong> (autoPublishStr.equals(<span class="jxr_string">"true"</span>)) {
<a name="1318" href="#1318">1318</a>                         publishConfig.put(
<a name="1319" href="#1319">1319</a>                             MetaWeblogPublisher.PROP_PUBLISH,
<a name="1320" href="#1320">1320</a>                             <span class="jxr_string">"true"</span>);
<a name="1321" href="#1321">1321</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="1322" href="#1322">1322</a>                         publishConfig.put(
<a name="1323" href="#1323">1323</a>                             MetaWeblogPublisher.PROP_PUBLISH,
<a name="1324" href="#1324">1324</a>                             <span class="jxr_string">"false"</span>);
<a name="1325" href="#1325">1325</a>                     }
<a name="1326" href="#1326">1326</a> 
<a name="1327" href="#1327">1327</a>                     <strong class="jxr_keyword">try</strong> {
<a name="1328" href="#1328">1328</a>                         <a href="../../../../org/methodize/nntprss/feed/publish/Publisher.html">Publisher</a> pub = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/publish/MetaWeblogPublisher.html">MetaWeblogPublisher</a>();
<a name="1329" href="#1329">1329</a>                         pub.validate(publishConfig);
<a name="1330" href="#1330">1330</a>                     } <strong class="jxr_keyword">catch</strong> (PublisherException pe) {
<a name="1331" href="#1331">1331</a>                         errors.add(
<a name="1332" href="#1332">1332</a>                             <span class="jxr_string">"Error validating MetaWeblog posting configuration - "</span>
<a name="1333" href="#1333">1333</a>                                 + pe.getMessage());
<a name="1334" href="#1334">1334</a>                         errors.add(<span class="jxr_string">"Check URL, user name, and password."</span>);
<a name="1335" href="#1335">1335</a>                     }
<a name="1336" href="#1336">1336</a> 
<a name="1337" href="#1337">1337</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (publishAPI.equals(<span class="jxr_string">"livejournal"</span>)) {
<a name="1338" href="#1338">1338</a>                     publishConfig.put(
<a name="1339" href="#1339">1339</a>                         LiveJournalPublisher.PROP_PUBLISHER_URL,
<a name="1340" href="#1340">1340</a>                         request.getParameter(
<a name="1341" href="#1341">1341</a>                             LiveJournalPublisher.PROP_PUBLISHER_URL));
<a name="1342" href="#1342">1342</a>                     publishConfig.put(
<a name="1343" href="#1343">1343</a>                         LiveJournalPublisher.PROP_USERNAME,
<a name="1344" href="#1344">1344</a>                         request.getParameter(
<a name="1345" href="#1345">1345</a>                             LiveJournalPublisher.PROP_USERNAME));
<a name="1346" href="#1346">1346</a> 
<a name="1347" href="#1347">1347</a>                     String password =
<a name="1348" href="#1348">1348</a>                         request.getParameter(
<a name="1349" href="#1349">1349</a>                             LiveJournalPublisher.PROP_PASSWORD);
<a name="1350" href="#1350">1350</a>                     <strong class="jxr_keyword">if</strong> (password.equals(PASSWORD_MAGIC_KEY)
<a name="1351" href="#1351">1351</a>                         &amp;&amp; (channel.getPublishConfig() != <strong class="jxr_keyword">null</strong>)) {
<a name="1352" href="#1352">1352</a>                         password =
<a name="1353" href="#1353">1353</a>                             (String) channel.getPublishConfig().get(
<a name="1354" href="#1354">1354</a>                                 LiveJournalPublisher.PROP_PASSWORD);
<a name="1355" href="#1355">1355</a>                     }
<a name="1356" href="#1356">1356</a>                     publishConfig.put(
<a name="1357" href="#1357">1357</a>                         LiveJournalPublisher.PROP_PASSWORD,
<a name="1358" href="#1358">1358</a>                         password);
<a name="1359" href="#1359">1359</a> 
<a name="1360" href="#1360">1360</a>                     <strong class="jxr_keyword">try</strong> {
<a name="1361" href="#1361">1361</a>                         <a href="../../../../org/methodize/nntprss/feed/publish/Publisher.html">Publisher</a> pub = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/publish/LiveJournalPublisher.html">LiveJournalPublisher</a>();
<a name="1362" href="#1362">1362</a>                         pub.validate(publishConfig);
<a name="1363" href="#1363">1363</a>                     } <strong class="jxr_keyword">catch</strong> (PublisherException pe) {
<a name="1364" href="#1364">1364</a>                         errors.add(
<a name="1365" href="#1365">1365</a>                             <span class="jxr_string">"Error validating LiveJournal posting configuration - "</span>
<a name="1366" href="#1366">1366</a>                                 + pe.getMessage());
<a name="1367" href="#1367">1367</a>                         errors.add(
<a name="1368" href="#1368">1368</a>                             <span class="jxr_string">"Check LiveJournal URL, user name, and password."</span>);
<a name="1369" href="#1369">1369</a>                     }
<a name="1370" href="#1370">1370</a>                 }
<a name="1371" href="#1371">1371</a> 
<a name="1372" href="#1372">1372</a>             }
<a name="1373" href="#1373">1373</a> 
<a name="1374" href="#1374">1374</a>             <strong class="jxr_keyword">if</strong> (errors.size() == 0) {
<a name="1375" href="#1375">1375</a>                 <strong class="jxr_keyword">try</strong> {
<a name="1376" href="#1376">1376</a>                     <strong class="jxr_keyword">boolean</strong> parseAtAllCost =
<a name="1377" href="#1377">1377</a>                         isChecked(request, <span class="jxr_string">"parseAtAllCost"</span>);
<a name="1378" href="#1378">1378</a>                     <strong class="jxr_keyword">boolean</strong> enabled = isChecked(request, <span class="jxr_string">"enabled"</span>);
<a name="1379" href="#1379">1379</a>                     <strong class="jxr_keyword">boolean</strong> valid = <strong class="jxr_keyword">true</strong>;
<a name="1380" href="#1380">1380</a> 
<a name="1381" href="#1381">1381</a>                     URL url = <strong class="jxr_keyword">new</strong> URL(urlString);
<a name="1382" href="#1382">1382</a>                     <strong class="jxr_keyword">if</strong> (!parseAtAllCost &amp;&amp; enabled) {
<a name="1383" href="#1383">1383</a>                         <strong class="jxr_keyword">try</strong> {
<a name="1384" href="#1384">1384</a>                             valid = Channel.isValid(url);
<a name="1385" href="#1385">1385</a>                             <strong class="jxr_keyword">if</strong> (!valid) {
<a name="1386" href="#1386">1386</a>                                 errors.add(
<a name="1387" href="#1387">1387</a>                                     <span class="jxr_string">"URL does not point to valid RSS or ATOM document"</span>);
<a name="1388" href="#1388">1388</a>                                 errors.add(
<a name="1389" href="#1389">1389</a>                                     <span class="jxr_string">"&lt;a target='validate' href='http://feedvalidator.org/check?url="</span>
<a name="1390" href="#1390">1390</a>                                         + urlString
<a name="1391" href="#1391">1391</a>                                         + <span class="jxr_string">"'&gt;Check the URL with the RSS and ATOM Validator @ archive.org&lt;/a&gt;&lt;br&gt;"</span>);
<a name="1392" href="#1392">1392</a>                             }
<a name="1393" href="#1393">1393</a>                         } <strong class="jxr_keyword">catch</strong> (HttpUserException hue) {
<a name="1394" href="#1394">1394</a>                             <strong class="jxr_keyword">if</strong> (hue.getStatus()
<a name="1395" href="#1395">1395</a>                                 == HttpStatus.SC_UNAUTHORIZED) {
<a name="1396" href="#1396">1396</a>                                 errors.add(
<a name="1397" href="#1397">1397</a>                                     <span class="jxr_string">"This feed requires user name and password authentication.  Please specify User Name and Password in the URL, e.g."</span>);
<a name="1398" href="#1398">1398</a>                                 errors.add(
<a name="1399" href="#1399">1399</a>                                     <span class="jxr_string">"http://username:password@www.myhost.com/"</span>);
<a name="1400" href="#1400">1400</a>                             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="1401" href="#1401">1401</a>                                 hue.getStatus()
<a name="1402" href="#1402">1402</a>                                     == HttpStatus
<a name="1403" href="#1403">1403</a>                                         .SC_PROXY_AUTHENTICATION_REQUIRED) {
<a name="1404" href="#1404">1404</a>                                 errors.add(
<a name="1405" href="#1405">1405</a>                                     <span class="jxr_string">"You are using a proxy server that requires authentication."</span>);
<a name="1406" href="#1406">1406</a>                                 errors.add(
<a name="1407" href="#1407">1407</a>                                     <span class="jxr_string">"Please enter your User Name and Password in the &lt;a href='?action=showconfig'&gt;System Configuration.&lt;/a&gt;"</span>);
<a name="1408" href="#1408">1408</a>                             }
<a name="1409" href="#1409">1409</a>                             valid = false;
<a name="1410" href="#1410">1410</a>                         }
<a name="1411" href="#1411">1411</a>                     }
<a name="1412" href="#1412">1412</a> 
<a name="1413" href="#1413">1413</a>                     <strong class="jxr_keyword">if</strong> (valid) {
<a name="1414" href="#1414">1414</a>                         channel.setUrl(url);
<a name="1415" href="#1415">1415</a>                         <em class="jxr_comment">//						channel.setHistorical(isChecked(request, "historical"));</em>
<a name="1416" href="#1416">1416</a>                         channel.setExpiration(
<a name="1417" href="#1417">1417</a>                             Long.parseLong(request.getParameter(<span class="jxr_string">"expiration"</span>)));
<a name="1418" href="#1418">1418</a> 
<a name="1419" href="#1419">1419</a>                         <strong class="jxr_keyword">int</strong> categoryId =
<a name="1420" href="#1420">1420</a>                             Integer.parseInt(
<a name="1421" href="#1421">1421</a>                                 request.getParameter(<span class="jxr_string">"categoryId"</span>));
<a name="1422" href="#1422">1422</a>                         <strong class="jxr_keyword">boolean</strong> categoryChanged =
<a name="1423" href="#1423">1423</a>                             ((!(categoryId == 0
<a name="1424" href="#1424">1424</a>                                 &amp;&amp; channel.getCategory() == <strong class="jxr_keyword">null</strong>))
<a name="1425" href="#1425">1425</a>                                 &amp;&amp; ((categoryId != 0
<a name="1426" href="#1426">1426</a>                                     &amp;&amp; channel.getCategory() == <strong class="jxr_keyword">null</strong>)
<a name="1427" href="#1427">1427</a>                                     || (categoryId
<a name="1428" href="#1428">1428</a>                                         != channel.getCategory().getId())));
<a name="1429" href="#1429">1429</a>                         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> oldCategory = channel.getCategory();
<a name="1430" href="#1430">1430</a> 
<a name="1431" href="#1431">1431</a>                         channel.setEnabled(enabled);
<a name="1432" href="#1432">1432</a>                         channel.setParseAtAllCost(parseAtAllCost);
<a name="1433" href="#1433">1433</a> 
<a name="1434" href="#1434">1434</a>                         channel.setPostingEnabled(postingEnabled);
<a name="1435" href="#1435">1435</a>                         channel.setPublishAPI(publishAPI);
<a name="1436" href="#1436">1436</a>                         channel.setPublishConfig(publishConfig);
<a name="1437" href="#1437">1437</a> 
<a name="1438" href="#1438">1438</a>                         channel.setPollingIntervalSeconds(
<a name="1439" href="#1439">1439</a>                             Long.parseLong(
<a name="1440" href="#1440">1440</a>                                 request.getParameter(<span class="jxr_string">"pollingInterval"</span>)));
<a name="1441" href="#1441">1441</a> 
<a name="1442" href="#1442">1442</a>                         <strong class="jxr_keyword">if</strong> (categoryChanged) {
<a name="1443" href="#1443">1443</a>                             <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = <strong class="jxr_keyword">null</strong>;
<a name="1444" href="#1444">1444</a>                             <strong class="jxr_keyword">if</strong> (oldCategory != <strong class="jxr_keyword">null</strong>) {
<a name="1445" href="#1445">1445</a>                                 oldCategory.removeChannel(channel);
<a name="1446" href="#1446">1446</a>                             }
<a name="1447" href="#1447">1447</a>                             <strong class="jxr_keyword">if</strong> (categoryId != 0) {
<a name="1448" href="#1448">1448</a>                                 category =
<a name="1449" href="#1449">1449</a>                                     channelManager.categoryById(categoryId);
<a name="1450" href="#1450">1450</a>                                 category.addChannel(channel);
<a name="1451" href="#1451">1451</a>                             }
<a name="1452" href="#1452">1452</a>                             channel.setCategory(category);
<a name="1453" href="#1453">1453</a>                         }
<a name="1454" href="#1454">1454</a> 
<a name="1455" href="#1455">1455</a>                         channel.save();
<a name="1456" href="#1456">1456</a> 
<a name="1457" href="#1457">1457</a>                         <strong class="jxr_keyword">if</strong> (enabled) {
<a name="1458" href="#1458">1458</a>                             <em class="jxr_comment">// Reset status and last polled date - channel should</em>
<a name="1459" href="#1459">1459</a>                             <em class="jxr_comment">// get repolled on next iteration</em>
<a name="1460" href="#1460">1460</a>                             channel.setStatus(Channel.STATUS_OK);
<a name="1461" href="#1461">1461</a>                             channel.setLastPolled(<strong class="jxr_keyword">null</strong>);
<a name="1462" href="#1462">1462</a>                         }
<a name="1463" href="#1463">1463</a>                     }
<a name="1464" href="#1464">1464</a>                 } <strong class="jxr_keyword">catch</strong> (MalformedURLException me) {
<a name="1465" href="#1465">1465</a>                     errors.add(<span class="jxr_string">"URL is malformed"</span>);
<a name="1466" href="#1466">1466</a>                 }
<a name="1467" href="#1467">1467</a>             }
<a name="1468" href="#1468">1468</a> 
<a name="1469" href="#1469">1469</a>             <strong class="jxr_keyword">if</strong> (errors.size() == 0) {
<a name="1470" href="#1470">1470</a>                 writer.write(
<a name="1471" href="#1471">1471</a>                     <span class="jxr_string">"Channel &lt;b&gt;"</span>
<a name="1472" href="#1472">1472</a>                         + channel.getName()
<a name="1473" href="#1473">1473</a>                         + <span class="jxr_string">"&lt;/b&gt; successfully updated.&lt;p&gt;"</span>);
<a name="1474" href="#1474">1474</a>                 writeChannel(writer, channel, request, false);
<a name="1475" href="#1475">1475</a>             } <strong class="jxr_keyword">else</strong> {
<a name="1476" href="#1476">1476</a>                 writer.write(
<a name="1477" href="#1477">1477</a>                     <span class="jxr_string">"&lt;b&gt;There were errors updating the channel:&lt;/b&gt;&lt;p&gt;"</span>);
<a name="1478" href="#1478">1478</a>                 writeErrors(writer, errors);
<a name="1479" href="#1479">1479</a>                 writeChannel(writer, channel, request, <strong class="jxr_keyword">true</strong>);
<a name="1480" href="#1480">1480</a>             }
<a name="1481" href="#1481">1481</a> 
<a name="1482" href="#1482">1482</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"delete"</span>) != <strong class="jxr_keyword">null</strong>) {
<a name="1483" href="#1483">1483</a>             channelManager.deleteChannel(channel);
<a name="1484" href="#1484">1484</a>             writer.write(
<a name="1485" href="#1485">1485</a>                 <span class="jxr_string">"Channel &lt;b&gt;"</span>
<a name="1486" href="#1486">1486</a>                     + channel.getName()
<a name="1487" href="#1487">1487</a>                     + <span class="jxr_string">"&lt;/b&gt; successfully deleted."</span>);
<a name="1488" href="#1488">1488</a>         }
<a name="1489" href="#1489">1489</a> 
<a name="1490" href="#1490">1490</a>         writeFooter(writer);
<a name="1491" href="#1491">1491</a>     }
<a name="1492" href="#1492">1492</a> 
<a name="1493" href="#1493">1493</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdUpdateCategory(
<a name="1494" href="#1494">1494</a>         HttpServletRequest request,
<a name="1495" href="#1495">1495</a>         HttpServletResponse response)
<a name="1496" href="#1496">1496</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1497" href="#1497">1497</a> 
<a name="1498" href="#1498">1498</a>         Writer writer = response.getWriter();
<a name="1499" href="#1499">1499</a>         writeHeader(writer, TAB_VIEW_CATEGORIES);
<a name="1500" href="#1500">1500</a> 
<a name="1501" href="#1501">1501</a>         String categoryName = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="1502" href="#1502">1502</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1503" href="#1503">1503</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1504" href="#1504">1504</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1505" href="#1505">1505</a>         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = channelManager.categoryByName(categoryName);
<a name="1506" href="#1506">1506</a> 
<a name="1507" href="#1507">1507</a>         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"delete"</span>) != <strong class="jxr_keyword">null</strong>) {
<a name="1508" href="#1508">1508</a>             channelManager.deleteCategory(category);
<a name="1509" href="#1509">1509</a>             writer.write(
<a name="1510" href="#1510">1510</a>                 <span class="jxr_string">"Category &lt;b&gt;"</span>
<a name="1511" href="#1511">1511</a>                     + category.getName()
<a name="1512" href="#1512">1512</a>                     + <span class="jxr_string">"&lt;/b&gt; successfully deleted."</span>);
<a name="1513" href="#1513">1513</a>         }
<a name="1514" href="#1514">1514</a> 
<a name="1515" href="#1515">1515</a>         writeFooter(writer);
<a name="1516" href="#1516">1516</a>     }
<a name="1517" href="#1517">1517</a> 
<a name="1518" href="#1518">1518</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdEditChannelRefresh(
<a name="1519" href="#1519">1519</a>         HttpServletRequest request,
<a name="1520" href="#1520">1520</a>         HttpServletResponse response)
<a name="1521" href="#1521">1521</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1522" href="#1522">1522</a> 
<a name="1523" href="#1523">1523</a>         Writer writer = response.getWriter();
<a name="1524" href="#1524">1524</a>         writeHeader(writer, TAB_VIEW_CHANNELS);
<a name="1525" href="#1525">1525</a> 
<a name="1526" href="#1526">1526</a>         String channelName = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="1527" href="#1527">1527</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1528" href="#1528">1528</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1529" href="#1529">1529</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1530" href="#1530">1530</a>         <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="1531" href="#1531">1531</a> 
<a name="1532" href="#1532">1532</a>         writeChannel(writer, channel, request, <strong class="jxr_keyword">true</strong>);
<a name="1533" href="#1533">1533</a> 
<a name="1534" href="#1534">1534</a>         writeFooter(writer);
<a name="1535" href="#1535">1535</a>     }
<a name="1536" href="#1536">1536</a> 
<a name="1537" href="#1537">1537</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> channelDelete(
<a name="1538" href="#1538">1538</a>         HttpServletRequest request)
<a name="1539" href="#1539">1539</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1540" href="#1540">1540</a> 
<a name="1541" href="#1541">1541</a>         Enumeration paramEnum = request.getParameterNames();
<a name="1542" href="#1542">1542</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1543" href="#1543">1543</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1544" href="#1544">1544</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1545" href="#1545">1545</a> 
<a name="1546" href="#1546">1546</a>         <strong class="jxr_keyword">while</strong> (paramEnum.hasMoreElements()) {
<a name="1547" href="#1547">1547</a>             String channelName = (String) paramEnum.nextElement();
<a name="1548" href="#1548">1548</a>             <strong class="jxr_keyword">if</strong> (channelName.startsWith(<span class="jxr_string">"chl"</span>)) {
<a name="1549" href="#1549">1549</a>                 <em class="jxr_comment">// Channel to delete...</em>
<a name="1550" href="#1550">1550</a>                 channelName = channelName.substring(3);
<a name="1551" href="#1551">1551</a>                 <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="1552" href="#1552">1552</a>                 <strong class="jxr_keyword">if</strong> (channel != <strong class="jxr_keyword">null</strong>) {
<a name="1553" href="#1553">1553</a>                     channelManager.deleteChannel(channel);
<a name="1554" href="#1554">1554</a>                 }
<a name="1555" href="#1555">1555</a>             }
<a name="1556" href="#1556">1556</a>         }
<a name="1557" href="#1557">1557</a>     }
<a name="1558" href="#1558">1558</a> 
<a name="1559" href="#1559">1559</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> channelRepoll(
<a name="1560" href="#1560">1560</a>         HttpServletRequest request)
<a name="1561" href="#1561">1561</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1562" href="#1562">1562</a> 
<a name="1563" href="#1563">1563</a>         Enumeration paramEnum = request.getParameterNames();
<a name="1564" href="#1564">1564</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1565" href="#1565">1565</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1566" href="#1566">1566</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1567" href="#1567">1567</a> 
<a name="1568" href="#1568">1568</a>         <strong class="jxr_keyword">while</strong> (paramEnum.hasMoreElements()) {
<a name="1569" href="#1569">1569</a>             String channelName = (String) paramEnum.nextElement();
<a name="1570" href="#1570">1570</a>             <strong class="jxr_keyword">if</strong> (channelName.startsWith(<span class="jxr_string">"chl"</span>)) {
<a name="1571" href="#1571">1571</a>                 <em class="jxr_comment">// Channel to repoll...</em>
<a name="1572" href="#1572">1572</a>                 channelName = channelName.substring(3);
<a name="1573" href="#1573">1573</a>                 <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="1574" href="#1574">1574</a>                 <strong class="jxr_keyword">if</strong> (channel != <strong class="jxr_keyword">null</strong>) {
<a name="1575" href="#1575">1575</a>                     <em class="jxr_comment">// Reset last polled</em>
<a name="1576" href="#1576">1576</a>                     channel.setLastPolled(<strong class="jxr_keyword">null</strong>);
<a name="1577" href="#1577">1577</a>                     channel.setStatus(Channel.STATUS_OK);
<a name="1578" href="#1578">1578</a>                 }
<a name="1579" href="#1579">1579</a>             }
<a name="1580" href="#1580">1580</a>         }
<a name="1581" href="#1581">1581</a>     }
<a name="1582" href="#1582">1582</a> 
<a name="1583" href="#1583">1583</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdChannelAction(
<a name="1584" href="#1584">1584</a>         HttpServletRequest request,
<a name="1585" href="#1585">1585</a>         HttpServletResponse response)
<a name="1586" href="#1586">1586</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1587" href="#1587">1587</a> 
<a name="1588" href="#1588">1588</a>         <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"delete"</span>) != <strong class="jxr_keyword">null</strong>) {
<a name="1589" href="#1589">1589</a>             channelDelete(request);
<a name="1590" href="#1590">1590</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (request.getParameter(<span class="jxr_string">"repoll"</span>) != <strong class="jxr_keyword">null</strong>) {
<a name="1591" href="#1591">1591</a>             channelRepoll(request);
<a name="1592" href="#1592">1592</a>         }
<a name="1593" href="#1593">1593</a> 
<a name="1594" href="#1594">1594</a>         <em class="jxr_comment">// Redirect to main page after performing channel action - otherwise</em>
<a name="1595" href="#1595">1595</a>         <em class="jxr_comment">// user could hit refresh and resubmit the channel action</em>
<a name="1596" href="#1596">1596</a>         response.sendRedirect(<span class="jxr_string">"/"</span>);
<a name="1597" href="#1597">1597</a>         <em class="jxr_comment">//		cmdShowCurrentChannels(request, response);</em>
<a name="1598" href="#1598">1598</a>     }
<a name="1599" href="#1599">1599</a> 
<a name="1600" href="#1600">1600</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdShowCurrentChannels(
<a name="1601" href="#1601">1601</a>         HttpServletResponse response)
<a name="1602" href="#1602">1602</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1603" href="#1603">1603</a> 
<a name="1604" href="#1604">1604</a>         DateFormat df =
<a name="1605" href="#1605">1605</a>             DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
<a name="1606" href="#1606">1606</a> 
<a name="1607" href="#1607">1607</a>         Writer writer = response.getWriter();
<a name="1608" href="#1608">1608</a>         writeHeader(writer, TAB_VIEW_CHANNELS);
<a name="1609" href="#1609">1609</a> 
<a name="1610" href="#1610">1610</a>         writeCheckboxSelector(writer, <span class="jxr_string">"checkAllChannels"</span>, <span class="jxr_string">"chl"</span>, <span class="jxr_string">"channels"</span>);
<a name="1611" href="#1611">1611</a> 
<a name="1612" href="#1612">1612</a>         writer.write(
<a name="1613" href="#1613">1613</a>             <span class="jxr_string">"&lt;form name='channels' action='/?action=channelaction' method='POST'&gt;"</span>);
<a name="1614" href="#1614">1614</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder' border='0'&gt;"</span>);
<a name="1615" href="#1615">1615</a>         writer.write(
<a name="1616" href="#1616">1616</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='5' class='tableHead'&gt;Channels&lt;/td&gt;&lt;/th&gt;"</span>);
<a name="1617" href="#1617">1617</a>         <em class="jxr_comment">//		writer.write("&lt;tr&gt;&lt;th class='subHead'&gt;&lt;input type='checkbox' name='change' onClick='checkAllChannels(this);'&gt;&lt;/th&gt;&lt;th class='subHead'&gt;Newsgroup Name&lt;/th&gt;&lt;th class='subHead'&gt;RSS URL&lt;/th&gt;&lt;th class='subHead'&gt;Last Polled&lt;/th&gt;&lt;/tr&gt;");</em>
<a name="1618" href="#1618">1618</a>         writer.write(
<a name="1619" href="#1619">1619</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;&lt;input type='checkbox' name='change' onClick='checkAllChannels(this);'&gt;&lt;/th&gt;&lt;th class='subHead'&gt;Newsgroup Name&lt;/th&gt;&lt;th class='subHead'&gt;&amp;nbsp;&lt;/th&gt;&lt;th class='subHead'&gt;Feed URL&lt;/th&gt;&lt;th class='subHead'&gt;Last Polled&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="1620" href="#1620">1620</a> 
<a name="1621" href="#1621">1621</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1622" href="#1622">1622</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1623" href="#1623">1623</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1624" href="#1624">1624</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer =
<a name="1625" href="#1625">1625</a>             (<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a>) getServletContext().getAttribute(
<a name="1626" href="#1626">1626</a>                 AdminServer.SERVLET_CTX_NNTP_SERVER);
<a name="1627" href="#1627">1627</a> 
<a name="1628" href="#1628">1628</a>         Iterator channelIter = channelManager.channels();
<a name="1629" href="#1629">1629</a>         String newsPrefix = getNewsURLPrefix(nntpServer);
<a name="1630" href="#1630">1630</a> 
<a name="1631" href="#1631">1631</a>         <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="1632" href="#1632">1632</a>             <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = (Channel) channelIter.next();
<a name="1633" href="#1633">1633</a>             writer.write(
<a name="1634" href="#1634">1634</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1'&gt;&lt;input type='checkbox' name='chl"</span>
<a name="1635" href="#1635">1635</a>                     + HTMLHelper.escapeString(channel.getName())
<a name="1636" href="#1636">1636</a>                     + <span class="jxr_string">"'&gt;&lt;/td&gt;"</span>);
<a name="1637" href="#1637">1637</a> 
<a name="1638" href="#1638">1638</a>             <em class="jxr_comment">// Truncate displayed URL...</em>
<a name="1639" href="#1639">1639</a>             String url = channel.getUrl();
<a name="1640" href="#1640">1640</a>             <strong class="jxr_keyword">if</strong> (url.length() &gt; 32) {
<a name="1641" href="#1641">1641</a>                 url = url.substring(0, 32) + <span class="jxr_string">"..."</span>;
<a name="1642" href="#1642">1642</a>             }
<a name="1643" href="#1643">1643</a> 
<a name="1644" href="#1644">1644</a>             String lastPolled;
<a name="1645" href="#1645">1645</a>             <strong class="jxr_keyword">if</strong> (channel.getLastPolled() != <strong class="jxr_keyword">null</strong>) {
<a name="1646" href="#1646">1646</a>                 lastPolled = df.format(channel.getLastPolled());
<a name="1647" href="#1647">1647</a>             } <strong class="jxr_keyword">else</strong> {
<a name="1648" href="#1648">1648</a>                 lastPolled = <span class="jxr_string">"Awaiting poll"</span>;
<a name="1649" href="#1649">1649</a>             }
<a name="1650" href="#1650">1650</a> 
<a name="1651" href="#1651">1651</a>             String parser = (channel.isParseAtAllCost() ? <span class="jxr_string">"*"</span> : <span class="jxr_string">""</span>);
<a name="1652" href="#1652">1652</a> 
<a name="1653" href="#1653">1653</a>             <strong class="jxr_keyword">switch</strong> (channel.getStatus()) {
<a name="1654" href="#1654">1654</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_INVALID_CONTENT :
<a name="1655" href="#1655">1655</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_NOT_FOUND :
<a name="1656" href="#1656">1656</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_UNKNOWN_HOST :
<a name="1657" href="#1657">1657</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_NO_ROUTE_TO_HOST :
<a name="1658" href="#1658">1658</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_PROXY_AUTHENTICATION_REQUIRED :
<a name="1659" href="#1659">1659</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_USER_AUTHENTICATION_REQUIRED :
<a name="1660" href="#1660">1660</a>                     writer.write(
<a name="1661" href="#1661">1661</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;"</span>
<a name="1662" href="#1662">1662</a>                             + parser
<a name="1663" href="#1663">1663</a>                             + <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=show&amp;name="</span>
<a name="1664" href="#1664">1664</a>                             + URLEncoder.encode(channel.getName())
<a name="1665" href="#1665">1665</a>                             + <span class="jxr_string">"'&gt;&lt;font color='#FFFFFF'&gt;"</span>
<a name="1666" href="#1666">1666</a>                             + channel.getName()
<a name="1667" href="#1667">1667</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1668" href="#1668">1668</a>                     writer.write(
<a name="1669" href="#1669">1669</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;a class='row' title='Read this channel in your default newsreader' href='"</span>
<a name="1670" href="#1670">1670</a>                             + newsPrefix
<a name="1671" href="#1671">1671</a>                             + HTMLHelper.escapeString(channel.getName())
<a name="1672" href="#1672">1672</a>                             + <span class="jxr_string">"'&gt;&lt;font color='#FFFFFF'&gt;[Read]&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1673" href="#1673">1673</a>                     writer.write(
<a name="1674" href="#1674">1674</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;"</span>
<a name="1675" href="#1675">1675</a>                             + url
<a name="1676" href="#1676">1676</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/td&gt;"</span>);
<a name="1677" href="#1677">1677</a>                     writer.write(
<a name="1678" href="#1678">1678</a>                         <span class="jxr_string">"&lt;td class='chlerror' bgcolor='#FF0000'&gt;&lt;font color='#FFFFFF'&gt;"</span>
<a name="1679" href="#1679">1679</a>                             + lastPolled
<a name="1680" href="#1680">1680</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1681" href="#1681">1681</a>                     <strong class="jxr_keyword">break</strong>;
<a name="1682" href="#1682">1682</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_SOCKET_EXCEPTION :
<a name="1683" href="#1683">1683</a>                 <strong class="jxr_keyword">case</strong> Channel.STATUS_CONNECTION_TIMEOUT :
<a name="1684" href="#1684">1684</a>                     writer.write(
<a name="1685" href="#1685">1685</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;"</span>
<a name="1686" href="#1686">1686</a>                             + parser
<a name="1687" href="#1687">1687</a>                             + <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=show&amp;name="</span>
<a name="1688" href="#1688">1688</a>                             + URLEncoder.encode(channel.getName())
<a name="1689" href="#1689">1689</a>                             + <span class="jxr_string">"'&gt;&lt;font color='#000000'&gt;"</span>
<a name="1690" href="#1690">1690</a>                             + channel.getName()
<a name="1691" href="#1691">1691</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1692" href="#1692">1692</a>                     writer.write(
<a name="1693" href="#1693">1693</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;&lt;a class='row' title='Read this channel in your default newsreader' href='"</span>
<a name="1694" href="#1694">1694</a>                             + newsPrefix
<a name="1695" href="#1695">1695</a>                             + HTMLHelper.escapeString(channel.getName())
<a name="1696" href="#1696">1696</a>                             + <span class="jxr_string">"'&gt;[Read]&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1697" href="#1697">1697</a>                     writer.write(
<a name="1698" href="#1698">1698</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;&lt;font color='#000000'&gt;"</span>
<a name="1699" href="#1699">1699</a>                             + url
<a name="1700" href="#1700">1700</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/td&gt;"</span>);
<a name="1701" href="#1701">1701</a>                     writer.write(
<a name="1702" href="#1702">1702</a>                         <span class="jxr_string">"&lt;td class='chlwarning' bgcolor='#FFFF00'&gt;&lt;font color='#000000'&gt;"</span>
<a name="1703" href="#1703">1703</a>                             + lastPolled
<a name="1704" href="#1704">1704</a>                             + <span class="jxr_string">"&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1705" href="#1705">1705</a>                     <strong class="jxr_keyword">break</strong>;
<a name="1706" href="#1706">1706</a>                 <strong class="jxr_keyword">default</strong> :
<a name="1707" href="#1707">1707</a>                     <strong class="jxr_keyword">if</strong> (channel.isEnabled()) {
<a name="1708" href="#1708">1708</a>                         writer.write(
<a name="1709" href="#1709">1709</a>                             <span class="jxr_string">"&lt;td class='row1'&gt;"</span>
<a name="1710" href="#1710">1710</a>                                 + parser
<a name="1711" href="#1711">1711</a>                                 + <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=show&amp;name="</span>
<a name="1712" href="#1712">1712</a>                                 + URLEncoder.encode(channel.getName())
<a name="1713" href="#1713">1713</a>                                 + <span class="jxr_string">"'&gt;"</span>
<a name="1714" href="#1714">1714</a>                                 + channel.getName()
<a name="1715" href="#1715">1715</a>                                 + <span class="jxr_string">"&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1716" href="#1716">1716</a>                         writer.write(
<a name="1717" href="#1717">1717</a>                             <span class="jxr_string">"&lt;td class='row1'&gt;&lt;a class='row' title='Read this channel in your default newsreader' href='"</span>
<a name="1718" href="#1718">1718</a>                                 + newsPrefix
<a name="1719" href="#1719">1719</a>                                 + HTMLHelper.escapeString(channel.getName())
<a name="1720" href="#1720">1720</a>                                 + <span class="jxr_string">"'&gt;[Read]&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1721" href="#1721">1721</a> 
<a name="1722" href="#1722">1722</a>                         writer.write(<span class="jxr_string">"&lt;td class='row1'&gt;"</span> + url + <span class="jxr_string">"&lt;/td&gt;"</span>);
<a name="1723" href="#1723">1723</a>                         writer.write(
<a name="1724" href="#1724">1724</a>                             <span class="jxr_string">"&lt;td class='row1'&gt;"</span> + lastPolled + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1725" href="#1725">1725</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="1726" href="#1726">1726</a>                         writer.write(
<a name="1727" href="#1727">1727</a>                             <span class="jxr_string">"&lt;td class='chldisabled' bgcolor='#CCCCCC'&gt;"</span>
<a name="1728" href="#1728">1728</a>                                 + parser
<a name="1729" href="#1729">1729</a>                                 + <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=show&amp;name="</span>
<a name="1730" href="#1730">1730</a>                                 + URLEncoder.encode(channel.getName())
<a name="1731" href="#1731">1731</a>                                 + <span class="jxr_string">"'&gt;"</span>
<a name="1732" href="#1732">1732</a>                                 + channel.getName()
<a name="1733" href="#1733">1733</a>                                 + <span class="jxr_string">"&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1734" href="#1734">1734</a>                         writer.write(
<a name="1735" href="#1735">1735</a>                             <span class="jxr_string">"&lt;td class='chldisabled'&gt;&lt;a class='row' title='Read this channel in your default newsreader' href='"</span>
<a name="1736" href="#1736">1736</a>                                 + newsPrefix
<a name="1737" href="#1737">1737</a>                                 + HTMLHelper.escapeString(channel.getName())
<a name="1738" href="#1738">1738</a>                                 + <span class="jxr_string">"'&gt;[Read]&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1739" href="#1739">1739</a>                         writer.write(
<a name="1740" href="#1740">1740</a>                             <span class="jxr_string">"&lt;td class='chldisabled' bgcolor='#CCCCCC'&gt;"</span>
<a name="1741" href="#1741">1741</a>                                 + url
<a name="1742" href="#1742">1742</a>                                 + <span class="jxr_string">"&lt;/td&gt;"</span>);
<a name="1743" href="#1743">1743</a>                         writer.write(
<a name="1744" href="#1744">1744</a>                             <span class="jxr_string">"&lt;td class='chldisabled' bgcolor='#CCCCCC'&gt;"</span>
<a name="1745" href="#1745">1745</a>                                 + lastPolled
<a name="1746" href="#1746">1746</a>                                 + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1747" href="#1747">1747</a>                     }
<a name="1748" href="#1748">1748</a>             }
<a name="1749" href="#1749">1749</a>         }
<a name="1750" href="#1750">1750</a> 
<a name="1751" href="#1751">1751</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' colspan='5'&gt;"</span>);
<a name="1752" href="#1752">1752</a>         writer.write(
<a name="1753" href="#1753">1753</a>             <span class="jxr_string">"&lt;input type='submit' onClick='return confirm(\&quot;Are you sure you want to delete these channels?\&quot;);' name='delete' value='Delete Selected Channels'&gt;&amp;nbsp;&amp;nbsp;"</span>
<a name="1754" href="#1754">1754</a>                 + <span class="jxr_string">"&lt;input type='submit' onClick='return confirm(\&quot;Are you sure you want to repoll these channels?\&quot;);' name='repoll' value='Repoll Selected Channels'&gt;"</span>
<a name="1755" href="#1755">1755</a>                 + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1756" href="#1756">1756</a> 
<a name="1757" href="#1757">1757</a>         writer.write(
<a name="1758" href="#1758">1758</a>             <span class="jxr_string">"&lt;/table&gt;&lt;font size='-1'&gt;[* = Channel configured for Parse-At-All-Cost parser]&lt;/font&gt;&lt;p&gt;"</span>);
<a name="1759" href="#1759">1759</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;&lt;p&gt;"</span>);
<a name="1760" href="#1760">1760</a>         writeFooter(writer);
<a name="1761" href="#1761">1761</a>         writer.flush();
<a name="1762" href="#1762">1762</a> 
<a name="1763" href="#1763">1763</a>     }
<a name="1764" href="#1764">1764</a> 
<a name="1765" href="#1765">1765</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdShowCurrentCategories(
<a name="1766" href="#1766">1766</a>         HttpServletResponse response)
<a name="1767" href="#1767">1767</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1768" href="#1768">1768</a> 
<a name="1769" href="#1769">1769</a>         Writer writer = response.getWriter();
<a name="1770" href="#1770">1770</a>         writeHeader(writer, TAB_VIEW_CATEGORIES);
<a name="1771" href="#1771">1771</a> 
<a name="1772" href="#1772">1772</a>         <em class="jxr_comment">//		writeCheckboxSelector(writer, "checkAllChannels", "chl", "channels");</em>
<a name="1773" href="#1773">1773</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder' border='0'&gt;"</span>);
<a name="1774" href="#1774">1774</a> 
<a name="1775" href="#1775">1775</a>         writer.write(
<a name="1776" href="#1776">1776</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='tableHead'&gt;Categories&lt;/td&gt;&lt;/th&gt;"</span>);
<a name="1777" href="#1777">1777</a>         writer.write(
<a name="1778" href="#1778">1778</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='subHead'&gt;&lt;a class='head2' href=\&quot;?action=addcategoryform\&quot;&gt;Add Category&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="1779" href="#1779">1779</a>         <em class="jxr_comment">//		writer.write("&lt;tr&gt;&lt;th class='subHead'&gt;&lt;input type='checkbox' name='change' onClick='checkAllChannels(this);'&gt;&lt;/th&gt;&lt;th class='subHead'&gt;Newsgroup Name&lt;/th&gt;&lt;th class='subHead'&gt;RSS URL&lt;/th&gt;&lt;th class='subHead'&gt;Last Polled&lt;/th&gt;&lt;/tr&gt;");</em>
<a name="1780" href="#1780">1780</a>         writer.write(
<a name="1781" href="#1781">1781</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;&amp;nbsp;Category Newsgroup Name&amp;nbsp;&lt;/th&gt;&lt;th class='subHead'&gt;&amp;nbsp;&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="1782" href="#1782">1782</a> 
<a name="1783" href="#1783">1783</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1784" href="#1784">1784</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1785" href="#1785">1785</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1786" href="#1786">1786</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer =
<a name="1787" href="#1787">1787</a>             (<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a>) getServletContext().getAttribute(
<a name="1788" href="#1788">1788</a>                 AdminServer.SERVLET_CTX_NNTP_SERVER);
<a name="1789" href="#1789">1789</a> 
<a name="1790" href="#1790">1790</a>         Iterator categoryIter = channelManager.categories();
<a name="1791" href="#1791">1791</a>         String newsPrefix = getNewsURLPrefix(nntpServer);
<a name="1792" href="#1792">1792</a> 
<a name="1793" href="#1793">1793</a>         <strong class="jxr_keyword">while</strong> (categoryIter.hasNext()) {
<a name="1794" href="#1794">1794</a>             <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = (Category) categoryIter.next();
<a name="1795" href="#1795">1795</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;"</span>);
<a name="1796" href="#1796">1796</a>             writer.write(
<a name="1797" href="#1797">1797</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;"</span>
<a name="1798" href="#1798">1798</a>                     + <span class="jxr_string">"&lt;a class='row' title='Channel configuration' href='/?action=showcategory&amp;name="</span>
<a name="1799" href="#1799">1799</a>                     + URLEncoder.encode(category.getName())
<a name="1800" href="#1800">1800</a>                     + <span class="jxr_string">"'&gt;"</span>
<a name="1801" href="#1801">1801</a>                     + category.getName()
<a name="1802" href="#1802">1802</a>                     + <span class="jxr_string">"&lt;/a&gt;&lt;/td&gt;"</span>);
<a name="1803" href="#1803">1803</a>             writer.write(
<a name="1804" href="#1804">1804</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;&lt;a class='row' title='Read this category in your default newsreader' href='"</span>
<a name="1805" href="#1805">1805</a>                     + newsPrefix
<a name="1806" href="#1806">1806</a>                     + HTMLHelper.escapeString(category.getName())
<a name="1807" href="#1807">1807</a>                     + <span class="jxr_string">"'&gt;[Read]&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="1808" href="#1808">1808</a>         }
<a name="1809" href="#1809">1809</a> 
<a name="1810" href="#1810">1810</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="1811" href="#1811">1811</a>         writeFooter(writer);
<a name="1812" href="#1812">1812</a>         writer.flush();
<a name="1813" href="#1813">1813</a> 
<a name="1814" href="#1814">1814</a>     }
<a name="1815" href="#1815">1815</a> 
<a name="1816" href="#1816">1816</a>     <strong class="jxr_keyword">private</strong> String getNewsURLPrefix(<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer) {
<a name="1817" href="#1817">1817</a>         String newsPrefix;
<a name="1818" href="#1818">1818</a>         <strong class="jxr_keyword">if</strong> (nntpServer.getListenerPort() == 119) {
<a name="1819" href="#1819">1819</a>             newsPrefix = <span class="jxr_string">"news://"</span> + nntpServer.getHostName() + <span class="jxr_string">"/"</span>;
<a name="1820" href="#1820">1820</a>         } <strong class="jxr_keyword">else</strong> {
<a name="1821" href="#1821">1821</a>             newsPrefix =
<a name="1822" href="#1822">1822</a>                 <span class="jxr_string">"news://"</span>
<a name="1823" href="#1823">1823</a>                     + nntpServer.getHostName()
<a name="1824" href="#1824">1824</a>                     + <span class="jxr_string">":"</span>
<a name="1825" href="#1825">1825</a>                     + nntpServer.getListenerPort()
<a name="1826" href="#1826">1826</a>                     + <span class="jxr_string">"/"</span>;
<a name="1827" href="#1827">1827</a>         }
<a name="1828" href="#1828">1828</a>         <strong class="jxr_keyword">return</strong> newsPrefix;
<a name="1829" href="#1829">1829</a>     }
<a name="1830" href="#1830">1830</a> 
<a name="1831" href="#1831">1831</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdQuickEditChannels(
<a name="1832" href="#1832">1832</a>         HttpServletResponse response,
<a name="1833" href="#1833">1833</a>         <strong class="jxr_keyword">boolean</strong> updated)
<a name="1834" href="#1834">1834</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="1835" href="#1835">1835</a> 
<a name="1836" href="#1836">1836</a>         Writer writer = response.getWriter();
<a name="1837" href="#1837">1837</a>         writeHeader(writer, TAB_QUICKEDIT);
<a name="1838" href="#1838">1838</a> 
<a name="1839" href="#1839">1839</a>         writeCheckboxSelector(writer, <span class="jxr_string">"checkAllEnabled"</span>, <span class="jxr_string">"enabled"</span>, <span class="jxr_string">"channels"</span>);
<a name="1840" href="#1840">1840</a>         writeCheckboxSelector(
<a name="1841" href="#1841">1841</a>             writer,
<a name="1842" href="#1842">1842</a>             <span class="jxr_string">"checkAllParse"</span>,
<a name="1843" href="#1843">1843</a>             <span class="jxr_string">"parseAtAllCost"</span>,
<a name="1844" href="#1844">1844</a>             <span class="jxr_string">"channels"</span>);
<a name="1845" href="#1845">1845</a>         <em class="jxr_comment">//		writeCheckboxSelector(writer, "checkAllHistorical", "historical", "channels");</em>
<a name="1846" href="#1846">1846</a> 
<a name="1847" href="#1847">1847</a>         <strong class="jxr_keyword">if</strong> (updated) {
<a name="1848" href="#1848">1848</a>             writer.write(<span class="jxr_string">"&lt;b&gt;Channels successfully updated!&lt;/b&gt;"</span>);
<a name="1849" href="#1849">1849</a>         }
<a name="1850" href="#1850">1850</a> 
<a name="1851" href="#1851">1851</a>         writer.write(
<a name="1852" href="#1852">1852</a>             <span class="jxr_string">"&lt;form name='channels' action='/?action=quickeditupdate' method='POST'&gt;"</span>);
<a name="1853" href="#1853">1853</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder' border='0'&gt;"</span>);
<a name="1854" href="#1854">1854</a>         writer.write(
<a name="1855" href="#1855">1855</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='6' class='tableHead'&gt;Channels&lt;/td&gt;&lt;/th&gt;"</span>);
<a name="1856" href="#1856">1856</a> 
<a name="1857" href="#1857">1857</a>         writer.write(
<a name="1858" href="#1858">1858</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;Newsgroup Name&lt;/th&gt;"</span>
<a name="1859" href="#1859">1859</a>                 + <span class="jxr_string">"&lt;th class='subHead'&gt;&lt;input type='checkbox' name='changeEnabled' onClick='checkAllEnabled(this);'&gt;Enabled&lt;/th&gt;"</span>
<a name="1860" href="#1860">1860</a>                 + <span class="jxr_string">"&lt;th class='subHead'&gt;Category&lt;/th&gt;"</span>
<a name="1861" href="#1861">1861</a>                 + <span class="jxr_string">"&lt;th class='subHead'&gt;Polling Interval&lt;/th&gt;"</span>
<a name="1862" href="#1862">1862</a>                 + <span class="jxr_string">"&lt;th class='subHead'&gt;&lt;input type='checkbox' name='changeParse' onClick='checkAllParse(this);'&gt;Parse-at-all-costs&lt;/th&gt;"</span>
<a name="1863" href="#1863">1863</a>                 + <span class="jxr_string">"&lt;th class='subHead'&gt;Expiration&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="1864" href="#1864">1864</a> 
<a name="1865" href="#1865">1865</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="1866" href="#1866">1866</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="1867" href="#1867">1867</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="1868" href="#1868">1868</a>         Iterator channelIter = channelManager.channels();
<a name="1869" href="#1869">1869</a> 
<a name="1870" href="#1870">1870</a>         <strong class="jxr_keyword">int</strong> chlCount = 0;
<a name="1871" href="#1871">1871</a>         <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="1872" href="#1872">1872</a>             <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = (Channel) channelIter.next();
<a name="1873" href="#1873">1873</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;"</span>);
<a name="1874" href="#1874">1874</a> 
<a name="1875" href="#1875">1875</a>             writer.write(
<a name="1876" href="#1876">1876</a>                 <span class="jxr_string">"&lt;input type='hidden' name='chl"</span>
<a name="1877" href="#1877">1877</a>                     + chlCount
<a name="1878" href="#1878">1878</a>                     + <span class="jxr_string">"' value='"</span>
<a name="1879" href="#1879">1879</a>                     + HTMLHelper.escapeString(channel.getName())
<a name="1880" href="#1880">1880</a>                     + <span class="jxr_string">"'&gt;"</span>);
<a name="1881" href="#1881">1881</a> 
<a name="1882" href="#1882">1882</a>             <em class="jxr_comment">// Channel name</em>
<a name="1883" href="#1883">1883</a>             writer.write(<span class="jxr_string">"&lt;td class='row1'&gt;"</span> + channel.getName() + <span class="jxr_string">"&lt;/td&gt;"</span>);
<a name="1884" href="#1884">1884</a> 
<a name="1885" href="#1885">1885</a>             <em class="jxr_comment">// Enabled</em>
<a name="1886" href="#1886">1886</a>             writer.write(
<a name="1887" href="#1887">1887</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;"</span>
<a name="1888" href="#1888">1888</a>                     + <span class="jxr_string">"&lt;input name='enabled"</span>
<a name="1889" href="#1889">1889</a>                     + chlCount
<a name="1890" href="#1890">1890</a>                     + <span class="jxr_string">"' type='checkbox' value='true' "</span>
<a name="1891" href="#1891">1891</a>                     + (channel.isEnabled() ? <span class="jxr_string">"checked&gt;"</span> : <span class="jxr_string">"&gt;"</span>)
<a name="1892" href="#1892">1892</a>                     + <span class="jxr_string">"&lt;/td&gt;"</span>);
<a name="1893" href="#1893">1893</a> 
<a name="1894" href="#1894">1894</a>             <em class="jxr_comment">// Category</em>
<a name="1895" href="#1895">1895</a>             <strong class="jxr_keyword">int</strong> categoryId = 0;
<a name="1896" href="#1896">1896</a>             <strong class="jxr_keyword">if</strong> (channel.getCategory() != <strong class="jxr_keyword">null</strong>) {
<a name="1897" href="#1897">1897</a>                 categoryId = channel.getCategory().getId();
<a name="1898" href="#1898">1898</a>             }
<a name="1899" href="#1899">1899</a>             writer.write(
<a name="1900" href="#1900">1900</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;&lt;select name='categoryId"</span> + chlCount + <span class="jxr_string">"'&gt;"</span>);
<a name="1901" href="#1901">1901</a>             writeOption(writer, <span class="jxr_string">"[No Category]"</span>, 0, categoryId);
<a name="1902" href="#1902">1902</a>             Iterator categories = channelManager.categories();
<a name="1903" href="#1903">1903</a>             <strong class="jxr_keyword">while</strong> (categories.hasNext()) {
<a name="1904" href="#1904">1904</a>                 <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = (Category) categories.next();
<a name="1905" href="#1905">1905</a>                 writeOption(
<a name="1906" href="#1906">1906</a>                     writer,
<a name="1907" href="#1907">1907</a>                     category.getName(),
<a name="1908" href="#1908">1908</a>                     category.getId(),
<a name="1909" href="#1909">1909</a>                     categoryId);
<a name="1910" href="#1910">1910</a>             }
<a name="1911" href="#1911">1911</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;"</span>);
<a name="1912" href="#1912">1912</a> 
<a name="1913" href="#1913">1913</a>             <em class="jxr_comment">// Polling Interval</em>
<a name="1914" href="#1914">1914</a>             writer.write(
<a name="1915" href="#1915">1915</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;"</span>
<a name="1916" href="#1916">1916</a>                     + <span class="jxr_string">"&lt;select name='pollingInterval"</span>
<a name="1917" href="#1917">1917</a>                     + chlCount
<a name="1918" href="#1918">1918</a>                     + <span class="jxr_string">"'&gt;"</span>);
<a name="1919" href="#1919">1919</a> 
<a name="1920" href="#1920">1920</a>             <strong class="jxr_keyword">if</strong> (channel.getPollingIntervalSeconds()
<a name="1921" href="#1921">1921</a>                 == Channel.DEFAULT_POLLING_INTERVAL) {
<a name="1922" href="#1922">1922</a>                 writer.write(
<a name="1923" href="#1923">1923</a>                     <span class="jxr_string">"&lt;option selected value='"</span>
<a name="1924" href="#1924">1924</a>                         + Channel.DEFAULT_POLLING_INTERVAL
<a name="1925" href="#1925">1925</a>                         + <span class="jxr_string">"'&gt;Default Interval\n"</span>);
<a name="1926" href="#1926">1926</a>             } <strong class="jxr_keyword">else</strong> {
<a name="1927" href="#1927">1927</a>                 writer.write(
<a name="1928" href="#1928">1928</a>                     <span class="jxr_string">"&lt;option selected value='"</span>
<a name="1929" href="#1929">1929</a>                         + channel.getPollingIntervalSeconds()
<a name="1930" href="#1930">1930</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="1931" href="#1931">1931</a>                         + channel.getPollingIntervalSeconds() / 60
<a name="1932" href="#1932">1932</a>                         + <span class="jxr_string">" minutes\n"</span>);
<a name="1933" href="#1933">1933</a>             }
<a name="1934" href="#1934">1934</a> 
<a name="1935" href="#1935">1935</a>             writer.write(
<a name="1936" href="#1936">1936</a>                 <span class="jxr_string">"&lt;option value='"</span>
<a name="1937" href="#1937">1937</a>                     + Channel.DEFAULT_POLLING_INTERVAL
<a name="1938" href="#1938">1938</a>                     + <span class="jxr_string">"'&gt;Default Polling\n"</span>);
<a name="1939" href="#1939">1939</a>             <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> interval = 10; interval &lt;= 120; interval += 10) {
<a name="1940" href="#1940">1940</a>                 writer.write(
<a name="1941" href="#1941">1941</a>                     <span class="jxr_string">"&lt;option value='"</span>
<a name="1942" href="#1942">1942</a>                         + (interval * 60)
<a name="1943" href="#1943">1943</a>                         + <span class="jxr_string">"'&gt;"</span>
<a name="1944" href="#1944">1944</a>                         + interval
<a name="1945" href="#1945">1945</a>                         + <span class="jxr_string">" minutes\n"</span>);
<a name="1946" href="#1946">1946</a>             }
<a name="1947" href="#1947">1947</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;"</span>);
<a name="1948" href="#1948">1948</a> 
<a name="1949" href="#1949">1949</a>             <em class="jxr_comment">// Parse-at-all-costs</em>
<a name="1950" href="#1950">1950</a>             writer.write(
<a name="1951" href="#1951">1951</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;&lt;input name='parseAtAllCost"</span>
<a name="1952" href="#1952">1952</a>                     + chlCount
<a name="1953" href="#1953">1953</a>                     + <span class="jxr_string">"' type='checkbox' value='true' "</span>
<a name="1954" href="#1954">1954</a>                     + (channel.isParseAtAllCost() ? <span class="jxr_string">"checked&gt;"</span> : <span class="jxr_string">"&gt;"</span>)
<a name="1955" href="#1955">1955</a>                     + <span class="jxr_string">"&lt;/td&gt;"</span>);
<a name="1956" href="#1956">1956</a> 
<a name="1957" href="#1957">1957</a>             <em class="jxr_comment">// Historical</em>
<a name="1958" href="#1958">1958</a>             <em class="jxr_comment">//			writer.write("&lt;td class='row1'&gt;&lt;input name='historical" + chlCount + "' type='checkbox' value='true' "</em>
<a name="1959" href="#1959">1959</a>             <em class="jxr_comment">//				+ (channel.isHistorical() ? "checked&gt;" : "&gt;")</em>
<a name="1960" href="#1960">1960</a>             <em class="jxr_comment">//				+ "&lt;/td&gt;");</em>
<a name="1961" href="#1961">1961</a> 
<a name="1962" href="#1962">1962</a>             <em class="jxr_comment">// @TODO Expiration</em>
<a name="1963" href="#1963">1963</a>             writer.write(
<a name="1964" href="#1964">1964</a>                 <span class="jxr_string">"&lt;td class='row1'&gt;&lt;select name='expiration"</span> + chlCount + <span class="jxr_string">"'&gt;"</span>);
<a name="1965" href="#1965">1965</a> 
<a name="1966" href="#1966">1966</a>             <strong class="jxr_keyword">long</strong> expiration = channel.getExpiration();
<a name="1967" href="#1967">1967</a> 
<a name="1968" href="#1968">1968</a>             writeOption(
<a name="1969" href="#1969">1969</a>                 writer,
<a name="1970" href="#1970">1970</a>                 <span class="jxr_string">"Keep all items"</span>,
<a name="1971" href="#1971">1971</a>                 Channel.EXPIRATION_KEEP,
<a name="1972" href="#1972">1972</a>                 expiration);
<a name="1973" href="#1973">1973</a>             writeOption(writer, <span class="jxr_string">"Keep only current items"</span>, 0, expiration);
<a name="1974" href="#1974">1974</a>             writeOption(
<a name="1975" href="#1975">1975</a>                 writer,
<a name="1976" href="#1976">1976</a>                 <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="1977" href="#1977">1977</a>                 (1000 * 60 * 60 * 24 * 1),
<a name="1978" href="#1978">1978</a>                 expiration);
<a name="1979" href="#1979">1979</a>             writeOption(
<a name="1980" href="#1980">1980</a>                 writer,
<a name="1981" href="#1981">1981</a>                 <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="1982" href="#1982">1982</a>                 (1000 * 60 * 60 * 24 * 2),
<a name="1983" href="#1983">1983</a>                 expiration);
<a name="1984" href="#1984">1984</a>             writeOption(
<a name="1985" href="#1985">1985</a>                 writer,
<a name="1986" href="#1986">1986</a>                 <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="1987" href="#1987">1987</a>                 (1000 * 60 * 60 * 24 * 4),
<a name="1988" href="#1988">1988</a>                 expiration);
<a name="1989" href="#1989">1989</a>             writeOption(
<a name="1990" href="#1990">1990</a>                 writer,
<a name="1991" href="#1991">1991</a>                 <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="1992" href="#1992">1992</a>                 (1000 * 60 * 60 * 24 * 7),
<a name="1993" href="#1993">1993</a>                 expiration);
<a name="1994" href="#1994">1994</a>             writeOption(
<a name="1995" href="#1995">1995</a>                 writer,
<a name="1996" href="#1996">1996</a>                 <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="1997" href="#1997">1997</a>                 (1000 * 60 * 60 * 24 * 14),
<a name="1998" href="#1998">1998</a>                 expiration);
<a name="1999" href="#1999">1999</a>             writeOption(
<a name="2000" href="#2000">2000</a>                 writer,
<a name="2001" href="#2001">2001</a>                 <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="2002" href="#2002">2002</a>                 (1000 * 60 * 60 * 24 * 28),
<a name="2003" href="#2003">2003</a>                 expiration);
<a name="2004" href="#2004">2004</a> 
<a name="2005" href="#2005">2005</a> 			writeOption(
<a name="2006" href="#2006">2006</a> 				writer,
<a name="2007" href="#2007">2007</a> 				<span class="jxr_string">"Keep items for 6 months"</span>,
<a name="2008" href="#2008">2008</a> 				((1000 * 60 * 60 * 24) * 180),
<a name="2009" href="#2009">2009</a> 				expiration);
<a name="2010" href="#2010">2010</a> 
<a name="2011" href="#2011">2011</a> 			writeOption(
<a name="2012" href="#2012">2012</a> 				writer,
<a name="2013" href="#2013">2013</a> 				<span class="jxr_string">"Keep items for 1 year"</span>,
<a name="2014" href="#2014">2014</a> 				((1000 * 60 * 60 * 24) * 365),
<a name="2015" href="#2015">2015</a> 				expiration);
<a name="2016" href="#2016">2016</a> 
<a name="2017" href="#2017">2017</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;"</span>);
<a name="2018" href="#2018">2018</a> 
<a name="2019" href="#2019">2019</a>             writer.write(<span class="jxr_string">"&lt;/tr&gt;"</span>);
<a name="2020" href="#2020">2020</a> 
<a name="2021" href="#2021">2021</a>             chlCount++;
<a name="2022" href="#2022">2022</a>         }
<a name="2023" href="#2023">2023</a> 
<a name="2024" href="#2024">2024</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' colspan='6'&gt;"</span>);
<a name="2025" href="#2025">2025</a>         writer.write(
<a name="2026" href="#2026">2026</a>             <span class="jxr_string">"&lt;input type='submit' onClick='return confirm(\&quot;Are you sure you want to update the configuration?\&quot;);' name='update' value='Update Channels'&gt;"</span>
<a name="2027" href="#2027">2027</a>                 + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2028" href="#2028">2028</a> 
<a name="2029" href="#2029">2029</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;&lt;p&gt;"</span>);
<a name="2030" href="#2030">2030</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;&lt;p&gt;"</span>);
<a name="2031" href="#2031">2031</a>         writeFooter(writer);
<a name="2032" href="#2032">2032</a>         writer.flush();
<a name="2033" href="#2033">2033</a>     }
<a name="2034" href="#2034">2034</a> 
<a name="2035" href="#2035">2035</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdQuickEditChannelsUpdate(
<a name="2036" href="#2036">2036</a>         HttpServletRequest request,
<a name="2037" href="#2037">2037</a>         HttpServletResponse response)
<a name="2038" href="#2038">2038</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2039" href="#2039">2039</a> 
<a name="2040" href="#2040">2040</a>         <strong class="jxr_keyword">int</strong> chlCount = 0;
<a name="2041" href="#2041">2041</a> 
<a name="2042" href="#2042">2042</a>         String channelName;
<a name="2043" href="#2043">2043</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2044" href="#2044">2044</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2045" href="#2045">2045</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2046" href="#2046">2046</a> 
<a name="2047" href="#2047">2047</a>         <strong class="jxr_keyword">while</strong> ((channelName = request.getParameter(<span class="jxr_string">"chl"</span> + chlCount))
<a name="2048" href="#2048">2048</a>             != <strong class="jxr_keyword">null</strong>) {
<a name="2049" href="#2049">2049</a>             <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = channelManager.channelByName(channelName);
<a name="2050" href="#2050">2050</a>             <strong class="jxr_keyword">if</strong> (channel != <strong class="jxr_keyword">null</strong>) {
<a name="2051" href="#2051">2051</a>                 <strong class="jxr_keyword">boolean</strong> enabled = isChecked(request, <span class="jxr_string">"enabled"</span> + chlCount);
<a name="2052" href="#2052">2052</a>                 <em class="jxr_comment">// @TODO Expiration</em>
<a name="2053" href="#2053">2053</a>                 <em class="jxr_comment">//				boolean historical = isChecked(request, "historical" + chlCount);</em>
<a name="2054" href="#2054">2054</a>                 <strong class="jxr_keyword">long</strong> expiration =
<a name="2055" href="#2055">2055</a>                     Long.parseLong(
<a name="2056" href="#2056">2056</a>                         request.getParameter(<span class="jxr_string">"expiration"</span> + chlCount));
<a name="2057" href="#2057">2057</a>                 <strong class="jxr_keyword">long</strong> pollingInterval =
<a name="2058" href="#2058">2058</a>                     Long.parseLong(
<a name="2059" href="#2059">2059</a>                         request.getParameter(<span class="jxr_string">"pollingInterval"</span> + chlCount));
<a name="2060" href="#2060">2060</a>                 <strong class="jxr_keyword">boolean</strong> parseAtAllCost =
<a name="2061" href="#2061">2061</a>                     isChecked(request, <span class="jxr_string">"parseAtAllCost"</span> + chlCount);
<a name="2062" href="#2062">2062</a>                 <strong class="jxr_keyword">int</strong> categoryId =
<a name="2063" href="#2063">2063</a>                     Integer.parseInt(
<a name="2064" href="#2064">2064</a>                         request.getParameter(<span class="jxr_string">"categoryId"</span> + chlCount));
<a name="2065" href="#2065">2065</a> 
<a name="2066" href="#2066">2066</a>                 <strong class="jxr_keyword">boolean</strong> channelUpdated = <strong class="jxr_keyword">true</strong>;
<a name="2067" href="#2067">2067</a> 
<a name="2068" href="#2068">2068</a>                 <strong class="jxr_keyword">if</strong> (channel.isEnabled() != enabled
<a name="2069" href="#2069">2069</a>                     || channel.getExpiration() != expiration
<a name="2070" href="#2070">2070</a>                     || channel.getPollingIntervalSeconds() != pollingInterval
<a name="2071" href="#2071">2071</a>                     || channel.isParseAtAllCost() != parseAtAllCost) {
<a name="2072" href="#2072">2072</a>                     <em class="jxr_comment">// Something changed, so update the channel</em>
<a name="2073" href="#2073">2073</a>                     channel.setEnabled(enabled);
<a name="2074" href="#2074">2074</a>                     <em class="jxr_comment">//					channel.setHistorical(historical);</em>
<a name="2075" href="#2075">2075</a>                     channel.setExpiration(expiration);
<a name="2076" href="#2076">2076</a>                     channel.setPollingIntervalSeconds(pollingInterval);
<a name="2077" href="#2077">2077</a>                     channel.setParseAtAllCost(parseAtAllCost);
<a name="2078" href="#2078">2078</a> 
<a name="2079" href="#2079">2079</a>                     channelUpdated = <strong class="jxr_keyword">true</strong>;
<a name="2080" href="#2080">2080</a>                 }
<a name="2081" href="#2081">2081</a> 
<a name="2082" href="#2082">2082</a>                 <strong class="jxr_keyword">boolean</strong> categoryChanged =
<a name="2083" href="#2083">2083</a>                     ((!(categoryId == 0 &amp;&amp; channel.getCategory() == <strong class="jxr_keyword">null</strong>))
<a name="2084" href="#2084">2084</a>                         &amp;&amp; ((categoryId != 0 &amp;&amp; channel.getCategory() == <strong class="jxr_keyword">null</strong>)
<a name="2085" href="#2085">2085</a>                             || (categoryId != channel.getCategory().getId())));
<a name="2086" href="#2086">2086</a> 
<a name="2087" href="#2087">2087</a>                 <strong class="jxr_keyword">if</strong> (categoryChanged) {
<a name="2088" href="#2088">2088</a>                     <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = channel.getCategory();
<a name="2089" href="#2089">2089</a>                     <strong class="jxr_keyword">if</strong> (category != <strong class="jxr_keyword">null</strong>) {
<a name="2090" href="#2090">2090</a>                         category.removeChannel(channel);
<a name="2091" href="#2091">2091</a>                     }
<a name="2092" href="#2092">2092</a>                     <strong class="jxr_keyword">if</strong> (categoryId != 0) {
<a name="2093" href="#2093">2093</a>                         category = channelManager.categoryById(categoryId);
<a name="2094" href="#2094">2094</a>                         category.addChannel(channel);
<a name="2095" href="#2095">2095</a>                     } <strong class="jxr_keyword">else</strong> {
<a name="2096" href="#2096">2096</a>                         category = <strong class="jxr_keyword">null</strong>;
<a name="2097" href="#2097">2097</a>                     }
<a name="2098" href="#2098">2098</a>                     channel.setCategory(category);
<a name="2099" href="#2099">2099</a>                     channelUpdated = <strong class="jxr_keyword">true</strong>;
<a name="2100" href="#2100">2100</a>                 }
<a name="2101" href="#2101">2101</a> 
<a name="2102" href="#2102">2102</a>                 <strong class="jxr_keyword">if</strong> (channelUpdated) {
<a name="2103" href="#2103">2103</a>                     channel.save();
<a name="2104" href="#2104">2104</a>                 }
<a name="2105" href="#2105">2105</a>             }
<a name="2106" href="#2106">2106</a> 
<a name="2107" href="#2107">2107</a>             chlCount++;
<a name="2108" href="#2108">2108</a>         }
<a name="2109" href="#2109">2109</a> 
<a name="2110" href="#2110">2110</a>         cmdQuickEditChannels(response, <strong class="jxr_keyword">true</strong>);
<a name="2111" href="#2111">2111</a>     }
<a name="2112" href="#2112">2112</a> 
<a name="2113" href="#2113">2113</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeCheckboxSelector(
<a name="2114" href="#2114">2114</a>         Writer writer,
<a name="2115" href="#2115">2115</a>         String functionName,
<a name="2116" href="#2116">2116</a>         String checkPrefix,
<a name="2117" href="#2117">2117</a>         String formName)
<a name="2118" href="#2118">2118</a>         <strong class="jxr_keyword">throws</strong> IOException {
<a name="2119" href="#2119">2119</a>         writer.write(<span class="jxr_string">"\n&lt;SCRIPT language='JavaScript'&gt;&lt;!--\n"</span>);
<a name="2120" href="#2120">2120</a> 
<a name="2121" href="#2121">2121</a>         writer.write(<span class="jxr_string">"function "</span> + functionName + <span class="jxr_string">"(checkBox)\n"</span>);
<a name="2122" href="#2122">2122</a>         writer.write(<span class="jxr_string">"{\n"</span>);
<a name="2123" href="#2123">2123</a>         writer.write(<span class="jxr_string">"  var form = document."</span> + formName + <span class="jxr_string">";\n"</span>);
<a name="2124" href="#2124">2124</a>         writer.write(
<a name="2125" href="#2125">2125</a>             <span class="jxr_string">"  for(var itemCount = 0; itemCount&lt;form.elements.length; itemCount++) {\n"</span>);
<a name="2126" href="#2126">2126</a>         writer.write(<span class="jxr_string">"    var item = form.elements[itemCount];\n"</span>);
<a name="2127" href="#2127">2127</a>         writer.write(
<a name="2128" href="#2128">2128</a>             <span class="jxr_string">"    if(item.type == 'checkbox' &amp;&amp; item.name.indexOf(\&quot;"</span>
<a name="2129" href="#2129">2129</a>                 + checkPrefix
<a name="2130" href="#2130">2130</a>                 + <span class="jxr_string">"\&quot;) == 0) {\n"</span>);
<a name="2131" href="#2131">2131</a>         writer.write(<span class="jxr_string">"      if(checkBox.checked) {\n"</span>);
<a name="2132" href="#2132">2132</a>         writer.write(<span class="jxr_string">" 		  item.checked = true;\n"</span>);
<a name="2133" href="#2133">2133</a>         writer.write(<span class="jxr_string">"      } else {\n"</span>);
<a name="2134" href="#2134">2134</a>         writer.write(<span class="jxr_string">"        item.checked = false;\n"</span>);
<a name="2135" href="#2135">2135</a>         writer.write(<span class="jxr_string">"      }\n"</span>);
<a name="2136" href="#2136">2136</a>         writer.write(<span class="jxr_string">"    }\n"</span>);
<a name="2137" href="#2137">2137</a>         writer.write(<span class="jxr_string">"  }\n"</span>);
<a name="2138" href="#2138">2138</a>         writer.write(<span class="jxr_string">"}\n"</span>);
<a name="2139" href="#2139">2139</a>         writer.write(<span class="jxr_string">"--&gt;&lt;/SCRIPT&gt;\n"</span>);
<a name="2140" href="#2140">2140</a>     }
<a name="2141" href="#2141">2141</a> 
<a name="2142" href="#2142">2142</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdAddChannelForm(
<a name="2143" href="#2143">2143</a>         HttpServletRequest request,
<a name="2144" href="#2144">2144</a>         HttpServletResponse response)
<a name="2145" href="#2145">2145</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2146" href="#2146">2146</a> 
<a name="2147" href="#2147">2147</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2148" href="#2148">2148</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2149" href="#2149">2149</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2150" href="#2150">2150</a> 
<a name="2151" href="#2151">2151</a>         <em class="jxr_comment">// If add has been called from an external page, passing in the URL</em>
<a name="2152" href="#2152">2152</a>         <em class="jxr_comment">// Check for it</em>
<a name="2153" href="#2153">2153</a>         String urlString = request.getParameter(<span class="jxr_string">"URL"</span>);
<a name="2154" href="#2154">2154</a>         String name = request.getParameter(<span class="jxr_string">"name"</span>);
<a name="2155" href="#2155">2155</a>         <strong class="jxr_keyword">if</strong> (name != <strong class="jxr_keyword">null</strong>) {
<a name="2156" href="#2156">2156</a>             name = name.trim();
<a name="2157" href="#2157">2157</a>         }
<a name="2158" href="#2158">2158</a> 
<a name="2159" href="#2159">2159</a>         <strong class="jxr_keyword">if</strong> ((name == <strong class="jxr_keyword">null</strong> || name.length() == 0) &amp;&amp; urlString != <strong class="jxr_keyword">null</strong>) {
<a name="2160" href="#2160">2160</a>             name = createChannelName(urlString);
<a name="2161" href="#2161">2161</a>         }
<a name="2162" href="#2162">2162</a> 
<a name="2163" href="#2163">2163</a>         <em class="jxr_comment">//		String historicalStr = request.getParameter("historical");</em>
<a name="2164" href="#2164">2164</a>         <em class="jxr_comment">//		boolean historical = true;</em>
<a name="2165" href="#2165">2165</a>         <em class="jxr_comment">//		if(historicalStr != null) {</em>
<a name="2166" href="#2166">2166</a>         <em class="jxr_comment">//			historical = historicalStr.equalsIgnoreCase("true");</em>
<a name="2167" href="#2167">2167</a>         <em class="jxr_comment">//		}</em>
<a name="2168" href="#2168">2168</a> 
<a name="2169" href="#2169">2169</a>         String expirationStr = request.getParameter(<span class="jxr_string">"expiration"</span>);
<a name="2170" href="#2170">2170</a>         <strong class="jxr_keyword">long</strong> expiration = Channel.EXPIRATION_KEEP;
<a name="2171" href="#2171">2171</a>         <strong class="jxr_keyword">if</strong> (expirationStr != <strong class="jxr_keyword">null</strong>) {
<a name="2172" href="#2172">2172</a>             expiration = Long.parseLong(expirationStr);
<a name="2173" href="#2173">2173</a>         }
<a name="2174" href="#2174">2174</a> 
<a name="2175" href="#2175">2175</a>         String validateStr = request.getParameter(<span class="jxr_string">"validate"</span>);
<a name="2176" href="#2176">2176</a>         <strong class="jxr_keyword">boolean</strong> validate = <strong class="jxr_keyword">true</strong>;
<a name="2177" href="#2177">2177</a>         <strong class="jxr_keyword">if</strong> (validateStr != <strong class="jxr_keyword">null</strong>) {
<a name="2178" href="#2178">2178</a>             validate = validateStr.equalsIgnoreCase(<span class="jxr_string">"true"</span>);
<a name="2179" href="#2179">2179</a>         }
<a name="2180" href="#2180">2180</a> 
<a name="2181" href="#2181">2181</a>         Writer writer = response.getWriter();
<a name="2182" href="#2182">2182</a>         writeHeader(writer, TAB_ADD_CHANNEL);
<a name="2183" href="#2183">2183</a>         writer.write(<span class="jxr_string">"&lt;form action='/?action=add' method='post'&gt;"</span>);
<a name="2184" href="#2184">2184</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="2185" href="#2185">2185</a> 
<a name="2186" href="#2186">2186</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2'&gt;Add Channel&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2187" href="#2187">2187</a> 
<a name="2188" href="#2188">2188</a>         <strong class="jxr_keyword">if</strong> (name != <strong class="jxr_keyword">null</strong>) {
<a name="2189" href="#2189">2189</a>             writer.write(
<a name="2190" href="#2190">2190</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Newsgroup Name:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='name' size='64' value='"</span>
<a name="2191" href="#2191">2191</a>                     + HTMLHelper.escapeString(name)
<a name="2192" href="#2192">2192</a>                     + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2193" href="#2193">2193</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2194" href="#2194">2194</a>             writer.write(
<a name="2195" href="#2195">2195</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Newsgroup Name:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='name' size='64'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2196" href="#2196">2196</a>         }
<a name="2197" href="#2197">2197</a> 
<a name="2198" href="#2198">2198</a>         <strong class="jxr_keyword">if</strong> (urlString != <strong class="jxr_keyword">null</strong> &amp;&amp; urlString.length() &gt; 0) {
<a name="2199" href="#2199">2199</a>             writer.write(
<a name="2200" href="#2200">2200</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Feed URL:&lt;/td&gt;&lt;td class='row2' &gt;&lt;input type='text' name='url' size='64' value='"</span>
<a name="2201" href="#2201">2201</a>                     + HTMLHelper.escapeString(urlString)
<a name="2202" href="#2202">2202</a>                     + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;(nntp//rss supports both RSS and ATOM feeds)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2203" href="#2203">2203</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2204" href="#2204">2204</a>             writer.write(
<a name="2205" href="#2205">2205</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Feed URL:&lt;/td&gt;&lt;td class='row2' &gt;&lt;input type='text' name='url' size='64' value='http://'&gt;&lt;br&gt;&lt;i&gt;(nntp//rss supports both RSS and ATOM feeds)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2206" href="#2206">2206</a>         }
<a name="2207" href="#2207">2207</a> 
<a name="2208" href="#2208">2208</a>         writer.write(
<a name="2209" href="#2209">2209</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right' valign='top'&gt;Item Expiration&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="2210" href="#2210">2210</a> 
<a name="2211" href="#2211">2211</a>         writer.write(<span class="jxr_string">"&lt;select name='expiration'&gt;"</span>);
<a name="2212" href="#2212">2212</a>         writeOption(
<a name="2213" href="#2213">2213</a>             writer,
<a name="2214" href="#2214">2214</a>             <span class="jxr_string">"Keep all items"</span>,
<a name="2215" href="#2215">2215</a>             Channel.EXPIRATION_KEEP,
<a name="2216" href="#2216">2216</a>             expiration);
<a name="2217" href="#2217">2217</a>         writeOption(writer, <span class="jxr_string">"Keep only current items"</span>, 0, expiration);
<a name="2218" href="#2218">2218</a>         writeOption(
<a name="2219" href="#2219">2219</a>             writer,
<a name="2220" href="#2220">2220</a>             <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="2221" href="#2221">2221</a>             (1000 * 60 * 60 * 24 * 1),
<a name="2222" href="#2222">2222</a>             expiration);
<a name="2223" href="#2223">2223</a>         writeOption(
<a name="2224" href="#2224">2224</a>             writer,
<a name="2225" href="#2225">2225</a>             <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="2226" href="#2226">2226</a>             (1000 * 60 * 60 * 24 * 2),
<a name="2227" href="#2227">2227</a>             expiration);
<a name="2228" href="#2228">2228</a>         writeOption(
<a name="2229" href="#2229">2229</a>             writer,
<a name="2230" href="#2230">2230</a>             <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="2231" href="#2231">2231</a>             (1000 * 60 * 60 * 24 * 4),
<a name="2232" href="#2232">2232</a>             expiration);
<a name="2233" href="#2233">2233</a>         writeOption(
<a name="2234" href="#2234">2234</a>             writer,
<a name="2235" href="#2235">2235</a>             <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="2236" href="#2236">2236</a>             (1000 * 60 * 60 * 24 * 7),
<a name="2237" href="#2237">2237</a>             expiration);
<a name="2238" href="#2238">2238</a>         writeOption(
<a name="2239" href="#2239">2239</a>             writer,
<a name="2240" href="#2240">2240</a>             <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="2241" href="#2241">2241</a>             (1000 * 60 * 60 * 24 * 14),
<a name="2242" href="#2242">2242</a>             expiration);
<a name="2243" href="#2243">2243</a>         writeOption(
<a name="2244" href="#2244">2244</a>             writer,
<a name="2245" href="#2245">2245</a>             <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="2246" href="#2246">2246</a>             (1000 * 60 * 60 * 24 * 28),
<a name="2247" href="#2247">2247</a>             expiration);
<a name="2248" href="#2248">2248</a> 		writeOption(
<a name="2249" href="#2249">2249</a> 			writer,
<a name="2250" href="#2250">2250</a> 			<span class="jxr_string">"Keep items for 6 months"</span>,
<a name="2251" href="#2251">2251</a> 			((1000 * 60 * 60 * 24) * 180),
<a name="2252" href="#2252">2252</a> 			expiration);
<a name="2253" href="#2253">2253</a> 		writeOption(
<a name="2254" href="#2254">2254</a> 			writer,
<a name="2255" href="#2255">2255</a> 			<span class="jxr_string">"Keep items for 1 year"</span>,
<a name="2256" href="#2256">2256</a> 			((1000 * 60 * 60 * 24) * 365),
<a name="2257" href="#2257">2257</a> 			expiration);
<a name="2258" href="#2258">2258</a> 
<a name="2259" href="#2259">2259</a>         writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2260" href="#2260">2260</a> 
<a name="2261" href="#2261">2261</a>         writer.write(
<a name="2262" href="#2262">2262</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right' valign='top'&gt;Validate&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='checkbox' value='true' name='validate' "</span>
<a name="2263" href="#2263">2263</a>                 + (validate ? <span class="jxr_string">"checked"</span> : <span class="jxr_string">""</span>)
<a name="2264" href="#2264">2264</a>                 + <span class="jxr_string">"&gt;"</span>
<a name="2265" href="#2265">2265</a>                 + <span class="jxr_string">"&lt;br&gt;&lt;i&gt;(Checked = Ensure URL points to a valid RSS or ATOM document)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2266" href="#2266">2266</a> 
<a name="2267" href="#2267">2267</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Category&lt;/td&gt;"</span>);
<a name="2268" href="#2268">2268</a>         writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='categoryId'&gt;"</span>);
<a name="2269" href="#2269">2269</a> 
<a name="2270" href="#2270">2270</a>         writeOption(writer, <span class="jxr_string">"[No Category]"</span>, 0, 0);
<a name="2271" href="#2271">2271</a>         Iterator categories = channelManager.categories();
<a name="2272" href="#2272">2272</a>         <strong class="jxr_keyword">while</strong> (categories.hasNext()) {
<a name="2273" href="#2273">2273</a>             <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = (Category) categories.next();
<a name="2274" href="#2274">2274</a>             writeOption(writer, category.getName(), category.getId(), 0);
<a name="2275" href="#2275">2275</a>         }
<a name="2276" href="#2276">2276</a>         writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2277" href="#2277">2277</a> 
<a name="2278" href="#2278">2278</a>         writer.write(
<a name="2279" href="#2279">2279</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' value='Add'&gt; &lt;input type='reset'&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="2280" href="#2280">2280</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="2281" href="#2281">2281</a> 
<a name="2282" href="#2282">2282</a>         writeFooter(writer);
<a name="2283" href="#2283">2283</a>         writer.flush();
<a name="2284" href="#2284">2284</a> 
<a name="2285" href="#2285">2285</a>     }
<a name="2286" href="#2286">2286</a> 
<a name="2287" href="#2287">2287</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdAddCategoryForm(
<a name="2288" href="#2288">2288</a>         HttpServletResponse response)
<a name="2289" href="#2289">2289</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2290" href="#2290">2290</a> 
<a name="2291" href="#2291">2291</a>         Writer writer = response.getWriter();
<a name="2292" href="#2292">2292</a>         writeHeader(writer, TAB_VIEW_CATEGORIES);
<a name="2293" href="#2293">2293</a>         writer.write(<span class="jxr_string">"&lt;form action='/?action=addcategory' method='post'&gt;"</span>);
<a name="2294" href="#2294">2294</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="2295" href="#2295">2295</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2'&gt;Add Category&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2296" href="#2296">2296</a>         writer.write(
<a name="2297" href="#2297">2297</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Category Newsgroup Name:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='name' size='64'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2298" href="#2298">2298</a>         writer.write(
<a name="2299" href="#2299">2299</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' value='Add'&gt; &lt;input type='reset'&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="2300" href="#2300">2300</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="2301" href="#2301">2301</a> 
<a name="2302" href="#2302">2302</a>         writeFooter(writer);
<a name="2303" href="#2303">2303</a>         writer.flush();
<a name="2304" href="#2304">2304</a>     }
<a name="2305" href="#2305">2305</a> 
<a name="2306" href="#2306">2306</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeErrors(Writer writer, List errors) <strong class="jxr_keyword">throws</strong> IOException {
<a name="2307" href="#2307">2307</a>         <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> errorCount = 0; errorCount &lt; errors.size(); errorCount++) {
<a name="2308" href="#2308">2308</a>             writer.write(errors.get(errorCount) + <span class="jxr_string">"&lt;br&gt;"</span>);
<a name="2309" href="#2309">2309</a>         }
<a name="2310" href="#2310">2310</a>     }
<a name="2311" href="#2311">2311</a> 
<a name="2312" href="#2312">2312</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdAddChannel(
<a name="2313" href="#2313">2313</a>         HttpServletRequest request,
<a name="2314" href="#2314">2314</a>         HttpServletResponse response)
<a name="2315" href="#2315">2315</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2316" href="#2316">2316</a> 
<a name="2317" href="#2317">2317</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2318" href="#2318">2318</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2319" href="#2319">2319</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2320" href="#2320">2320</a> 
<a name="2321" href="#2321">2321</a>         <a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a> nntpServer =
<a name="2322" href="#2322">2322</a>             (<a href="../../../../org/methodize/nntprss/nntp/NNTPServer.html">NNTPServer</a>) getServletContext().getAttribute(
<a name="2323" href="#2323">2323</a>                 AdminServer.SERVLET_CTX_NNTP_SERVER);
<a name="2324" href="#2324">2324</a> 
<a name="2325" href="#2325">2325</a>         String name = request.getParameter(<span class="jxr_string">"name"</span>).trim();
<a name="2326" href="#2326">2326</a>         String urlString = request.getParameter(<span class="jxr_string">"url"</span>).trim();
<a name="2327" href="#2327">2327</a>         <em class="jxr_comment">//		boolean historical = isChecked(request, "historical");</em>
<a name="2328" href="#2328">2328</a>         <strong class="jxr_keyword">boolean</strong> validate = isChecked(request, <span class="jxr_string">"validate"</span>);
<a name="2329" href="#2329">2329</a>         <strong class="jxr_keyword">long</strong> expiration = Long.parseLong(request.getParameter(<span class="jxr_string">"expiration"</span>));
<a name="2330" href="#2330">2330</a>         <strong class="jxr_keyword">int</strong> categoryId = Integer.parseInt(request.getParameter(<span class="jxr_string">"categoryId"</span>));
<a name="2331" href="#2331">2331</a> 
<a name="2332" href="#2332">2332</a>         List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="2333" href="#2333">2333</a>         <strong class="jxr_keyword">if</strong> (name.length() == 0) {
<a name="2334" href="#2334">2334</a>             errors.add(<span class="jxr_string">"Name cannot be empty"</span>);
<a name="2335" href="#2335">2335</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (name.indexOf(' ') &gt; -1) {
<a name="2336" href="#2336">2336</a>             errors.add(<span class="jxr_string">"Name cannot contain spaces"</span>);
<a name="2337" href="#2337">2337</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2338" href="#2338">2338</a>             channelManager.channelByName(name) != <strong class="jxr_keyword">null</strong>
<a name="2339" href="#2339">2339</a>                 || channelManager.categoryByName(name) != <strong class="jxr_keyword">null</strong>) {
<a name="2340" href="#2340">2340</a>             errors.add(<span class="jxr_string">"Name is already is use"</span>);
<a name="2341" href="#2341">2341</a>         }
<a name="2342" href="#2342">2342</a> 
<a name="2343" href="#2343">2343</a>         <strong class="jxr_keyword">if</strong> (urlString.length() == 0) {
<a name="2344" href="#2344">2344</a>             errors.add(<span class="jxr_string">"URL cannot be empty"</span>);
<a name="2345" href="#2345">2345</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2346" href="#2346">2346</a>             urlString.equals(<span class="jxr_string">"http://"</span>) || urlString.equals(<span class="jxr_string">"https://"</span>)) {
<a name="2347" href="#2347">2347</a>             errors.add(<span class="jxr_string">"You must specify a URL"</span>);
<a name="2348" href="#2348">2348</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2349" href="#2349">2349</a>             !urlString.startsWith(<span class="jxr_string">"http://"</span>)
<a name="2350" href="#2350">2350</a>                 &amp;&amp; !urlString.startsWith(<span class="jxr_string">"https://"</span>)) {
<a name="2351" href="#2351">2351</a>             errors.add(<span class="jxr_string">"Only URLs starting http:// or https:// are supported"</span>);
<a name="2352" href="#2352">2352</a>         }
<a name="2353" href="#2353">2353</a> 
<a name="2354" href="#2354">2354</a>         <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> newChannel = <strong class="jxr_keyword">null</strong>;
<a name="2355" href="#2355">2355</a>         <strong class="jxr_keyword">if</strong> (errors.size() == 0) {
<a name="2356" href="#2356">2356</a>             <strong class="jxr_keyword">try</strong> {
<a name="2357" href="#2357">2357</a>                 newChannel = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a>(name, urlString);
<a name="2358" href="#2358">2358</a>                 <em class="jxr_comment">//				newChannel.setHistorical(historical);</em>
<a name="2359" href="#2359">2359</a>                 newChannel.setExpiration(expiration);
<a name="2360" href="#2360">2360</a>                 <strong class="jxr_keyword">if</strong> (validate &amp;&amp; !newChannel.isValid()) {
<a name="2361" href="#2361">2361</a>                     errors.add(
<a name="2362" href="#2362">2362</a>                         <span class="jxr_string">"URL does not point to valid RSS or ATOM document"</span>);
<a name="2363" href="#2363">2363</a>                     errors.add(
<a name="2364" href="#2364">2364</a>                         <span class="jxr_string">"&lt;a target='validate' href='http://feedvalidator.org/check?url="</span>
<a name="2365" href="#2365">2365</a>                             + urlString
<a name="2366" href="#2366">2366</a>                             + <span class="jxr_string">"'&gt;Check the URL with the RSS and ATOM Validator @ archive.org&lt;/a&gt;"</span>);
<a name="2367" href="#2367">2367</a>                     newChannel = <strong class="jxr_keyword">null</strong>;
<a name="2368" href="#2368">2368</a>                 }
<a name="2369" href="#2369">2369</a>             } <strong class="jxr_keyword">catch</strong> (HttpUserException hue) {
<a name="2370" href="#2370">2370</a>                 <strong class="jxr_keyword">if</strong> (hue.getStatus() == HttpStatus.SC_UNAUTHORIZED) {
<a name="2371" href="#2371">2371</a>                     errors.add(
<a name="2372" href="#2372">2372</a>                         <span class="jxr_string">"This feed requires user name and password authentication."</span>);
<a name="2373" href="#2373">2373</a>                     errors.add(
<a name="2374" href="#2374">2374</a>                         <span class="jxr_string">"Please specify User Name and Password in the URL, e.g."</span>);
<a name="2375" href="#2375">2375</a>                     errors.add(<span class="jxr_string">"http://username:password@www.myhost.com/"</span>);
<a name="2376" href="#2376">2376</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2377" href="#2377">2377</a>                     hue.getStatus()
<a name="2378" href="#2378">2378</a>                         == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) {
<a name="2379" href="#2379">2379</a>                     errors.add(
<a name="2380" href="#2380">2380</a>                         <span class="jxr_string">"You are using a proxy server that requires authentication."</span>);
<a name="2381" href="#2381">2381</a>                     errors.add(
<a name="2382" href="#2382">2382</a>                         <span class="jxr_string">"Please enter your User Name and Password in the &lt;a href='?action=showconfig'&gt;System Configuration.&lt;/a&gt;"</span>);
<a name="2383" href="#2383">2383</a>                 }
<a name="2384" href="#2384">2384</a>             } <strong class="jxr_keyword">catch</strong> (MalformedURLException me) {
<a name="2385" href="#2385">2385</a>                 errors.add(
<a name="2386" href="#2386">2386</a>                     <span class="jxr_string">"URL is malformed ("</span> + me.getLocalizedMessage() + <span class="jxr_string">")"</span>);
<a name="2387" href="#2387">2387</a>             }
<a name="2388" href="#2388">2388</a>         }
<a name="2389" href="#2389">2389</a> 
<a name="2390" href="#2390">2390</a>         Writer writer = response.getWriter();
<a name="2391" href="#2391">2391</a>         writeHeader(writer, TAB_ADD_CHANNEL);
<a name="2392" href="#2392">2392</a> 
<a name="2393" href="#2393">2393</a>         <strong class="jxr_keyword">if</strong> (errors.size() &gt; 0) {
<a name="2394" href="#2394">2394</a>             writer.write(<span class="jxr_string">"&lt;b&gt;There were errors adding your channel:&lt;/b&gt;&lt;p&gt;"</span>);
<a name="2395" href="#2395">2395</a>             writeErrors(writer, errors);
<a name="2396" href="#2396">2396</a>             writer.write(<span class="jxr_string">"&lt;p&gt;"</span>);
<a name="2397" href="#2397">2397</a>             writer.write(<span class="jxr_string">"&lt;form action='/?action=add' method='post'&gt;"</span>);
<a name="2398" href="#2398">2398</a>             writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="2399" href="#2399">2399</a> 
<a name="2400" href="#2400">2400</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2'&gt;Add Channel&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2401" href="#2401">2401</a>             writer.write(
<a name="2402" href="#2402">2402</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Newsgroup Name:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='name' size='64' value='"</span>
<a name="2403" href="#2403">2403</a>                     + HTMLHelper.escapeString(name)
<a name="2404" href="#2404">2404</a>                     + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2405" href="#2405">2405</a>             writer.write(
<a name="2406" href="#2406">2406</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Feed URL:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='url' size='64' value='"</span>
<a name="2407" href="#2407">2407</a>                     + HTMLHelper.escapeString(urlString)
<a name="2408" href="#2408">2408</a>                     + <span class="jxr_string">"'&gt;&lt;br&gt;&lt;i&gt;(nntp//rss supports both RSS and ATOM feeds)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2409" href="#2409">2409</a> 
<a name="2410" href="#2410">2410</a>             <em class="jxr_comment">//			writer.write("&lt;tr&gt;&lt;td class='row1' align='right' valign='top'&gt;Historical&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='checkbox' value='true' name='historical' "</em>
<a name="2411" href="#2411">2411</a>             <em class="jxr_comment">//				+ (historical ? "checked" : "")</em>
<a name="2412" href="#2412">2412</a>             <em class="jxr_comment">//				+ "&gt;"</em>
<a name="2413" href="#2413">2413</a>             <em class="jxr_comment">//				+ "&lt;br&gt;&lt;i&gt;(Checked = Keep items removed from the original RSS document)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;");</em>
<a name="2414" href="#2414">2414</a> 
<a name="2415" href="#2415">2415</a>             writer.write(
<a name="2416" href="#2416">2416</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right' valign='top'&gt;Item Expiration&lt;/td&gt;&lt;td class='row2'&gt;"</span>);
<a name="2417" href="#2417">2417</a> 
<a name="2418" href="#2418">2418</a>             writer.write(<span class="jxr_string">"&lt;select name='expiration'&gt;"</span>);
<a name="2419" href="#2419">2419</a>             writeOption(
<a name="2420" href="#2420">2420</a>                 writer,
<a name="2421" href="#2421">2421</a>                 <span class="jxr_string">"Keep all items"</span>,
<a name="2422" href="#2422">2422</a>                 Channel.EXPIRATION_KEEP,
<a name="2423" href="#2423">2423</a>                 expiration);
<a name="2424" href="#2424">2424</a>             writeOption(writer, <span class="jxr_string">"Keep only current items"</span>, 0, expiration);
<a name="2425" href="#2425">2425</a>             writeOption(
<a name="2426" href="#2426">2426</a>                 writer,
<a name="2427" href="#2427">2427</a>                 <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="2428" href="#2428">2428</a>                 (1000 * 60 * 60 * 24 * 1),
<a name="2429" href="#2429">2429</a>                 expiration);
<a name="2430" href="#2430">2430</a>             writeOption(
<a name="2431" href="#2431">2431</a>                 writer,
<a name="2432" href="#2432">2432</a>                 <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="2433" href="#2433">2433</a>                 (1000 * 60 * 60 * 24 * 2),
<a name="2434" href="#2434">2434</a>                 expiration);
<a name="2435" href="#2435">2435</a>             writeOption(
<a name="2436" href="#2436">2436</a>                 writer,
<a name="2437" href="#2437">2437</a>                 <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="2438" href="#2438">2438</a>                 (1000 * 60 * 60 * 24 * 4),
<a name="2439" href="#2439">2439</a>                 expiration);
<a name="2440" href="#2440">2440</a>             writeOption(
<a name="2441" href="#2441">2441</a>                 writer,
<a name="2442" href="#2442">2442</a>                 <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="2443" href="#2443">2443</a>                 (1000 * 60 * 60 * 24 * 7),
<a name="2444" href="#2444">2444</a>                 expiration);
<a name="2445" href="#2445">2445</a>             writeOption(
<a name="2446" href="#2446">2446</a>                 writer,
<a name="2447" href="#2447">2447</a>                 <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="2448" href="#2448">2448</a>                 (1000 * 60 * 60 * 24 * 14),
<a name="2449" href="#2449">2449</a>                 expiration);
<a name="2450" href="#2450">2450</a>             writeOption(
<a name="2451" href="#2451">2451</a>                 writer,
<a name="2452" href="#2452">2452</a>                 <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="2453" href="#2453">2453</a>                 (1000 * 60 * 60 * 24 * 28),
<a name="2454" href="#2454">2454</a>                 expiration);
<a name="2455" href="#2455">2455</a> 
<a name="2456" href="#2456">2456</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2457" href="#2457">2457</a> 
<a name="2458" href="#2458">2458</a>             writer.write(
<a name="2459" href="#2459">2459</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right' valign='top'&gt;Validate&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='checkbox'  value='true' name='validate' "</span>
<a name="2460" href="#2460">2460</a>                     + (validate ? <span class="jxr_string">"checked"</span> : <span class="jxr_string">""</span>)
<a name="2461" href="#2461">2461</a>                     + <span class="jxr_string">"&gt;"</span>
<a name="2462" href="#2462">2462</a>                     + <span class="jxr_string">"&lt;br&gt;&lt;i&gt;(Checked = Ensure URL points to a valid RSS document)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2463" href="#2463">2463</a> 
<a name="2464" href="#2464">2464</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Category&lt;/td&gt;"</span>);
<a name="2465" href="#2465">2465</a>             writer.write(<span class="jxr_string">"&lt;td class='row2'&gt;&lt;select name='categoryId'&gt;"</span>);
<a name="2466" href="#2466">2466</a> 
<a name="2467" href="#2467">2467</a>             writeOption(writer, <span class="jxr_string">"[No Category]"</span>, 0, categoryId);
<a name="2468" href="#2468">2468</a>             Iterator categories = channelManager.categories();
<a name="2469" href="#2469">2469</a>             <strong class="jxr_keyword">while</strong> (categories.hasNext()) {
<a name="2470" href="#2470">2470</a>                 <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = (Category) categories.next();
<a name="2471" href="#2471">2471</a>                 writeOption(
<a name="2472" href="#2472">2472</a>                     writer,
<a name="2473" href="#2473">2473</a>                     category.getName(),
<a name="2474" href="#2474">2474</a>                     category.getId(),
<a name="2475" href="#2475">2475</a>                     categoryId);
<a name="2476" href="#2476">2476</a>             }
<a name="2477" href="#2477">2477</a>             writer.write(<span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2478" href="#2478">2478</a> 
<a name="2479" href="#2479">2479</a>             writer.write(
<a name="2480" href="#2480">2480</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' value='Add'&gt; &lt;input type='reset'&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="2481" href="#2481">2481</a>             writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="2482" href="#2482">2482</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2483" href="#2483">2483</a>             channelManager.addChannel(newChannel);
<a name="2484" href="#2484">2484</a>             <strong class="jxr_keyword">if</strong> (categoryId != 0) {
<a name="2485" href="#2485">2485</a>                 <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category = channelManager.categoryById(categoryId);
<a name="2486" href="#2486">2486</a>                 category.addChannel(newChannel);
<a name="2487" href="#2487">2487</a>                 newChannel.setCategory(category);
<a name="2488" href="#2488">2488</a>                 newChannel.save();
<a name="2489" href="#2489">2489</a>             }
<a name="2490" href="#2490">2490</a> 
<a name="2491" href="#2491">2491</a>             writer.write(
<a name="2492" href="#2492">2492</a>                 <span class="jxr_string">"Channel "</span> + newChannel.getName() + <span class="jxr_string">" successfully added.&lt;p&gt;"</span>);
<a name="2493" href="#2493">2493</a> 
<a name="2494" href="#2494">2494</a>             writer.write(
<a name="2495" href="#2495">2495</a>                 <span class="jxr_string">"&lt;a href='"</span>
<a name="2496" href="#2496">2496</a>                     + getNewsURLPrefix(nntpServer)
<a name="2497" href="#2497">2497</a>                     + newChannel.getName()
<a name="2498" href="#2498">2498</a>                     + <span class="jxr_string">"'&gt;"</span>
<a name="2499" href="#2499">2499</a>                     + <span class="jxr_string">"[View the channel in your newsreader]&lt;/a&gt;"</span>);
<a name="2500" href="#2500">2500</a>         }
<a name="2501" href="#2501">2501</a> 
<a name="2502" href="#2502">2502</a>         writeFooter(writer);
<a name="2503" href="#2503">2503</a>         writer.flush();
<a name="2504" href="#2504">2504</a> 
<a name="2505" href="#2505">2505</a>     }
<a name="2506" href="#2506">2506</a> 
<a name="2507" href="#2507">2507</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdAddCategory(
<a name="2508" href="#2508">2508</a>         HttpServletRequest request,
<a name="2509" href="#2509">2509</a>         HttpServletResponse response)
<a name="2510" href="#2510">2510</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2511" href="#2511">2511</a> 
<a name="2512" href="#2512">2512</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2513" href="#2513">2513</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2514" href="#2514">2514</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2515" href="#2515">2515</a> 
<a name="2516" href="#2516">2516</a>         String name = request.getParameter(<span class="jxr_string">"name"</span>).trim();
<a name="2517" href="#2517">2517</a> 
<a name="2518" href="#2518">2518</a>         List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="2519" href="#2519">2519</a>         <strong class="jxr_keyword">if</strong> (name.length() == 0) {
<a name="2520" href="#2520">2520</a>             errors.add(<span class="jxr_string">"Name cannot be empty"</span>);
<a name="2521" href="#2521">2521</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (name.indexOf(' ') &gt; -1) {
<a name="2522" href="#2522">2522</a>             errors.add(<span class="jxr_string">"Name cannot contain spaces"</span>);
<a name="2523" href="#2523">2523</a>         } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2524" href="#2524">2524</a>             channelManager.channelByName(name) != <strong class="jxr_keyword">null</strong>
<a name="2525" href="#2525">2525</a>                 || channelManager.categoryByName(name) != <strong class="jxr_keyword">null</strong>) {
<a name="2526" href="#2526">2526</a>             errors.add(<span class="jxr_string">"Name is already is use"</span>);
<a name="2527" href="#2527">2527</a>         }
<a name="2528" href="#2528">2528</a> 
<a name="2529" href="#2529">2529</a>         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> newCategory = <strong class="jxr_keyword">null</strong>;
<a name="2530" href="#2530">2530</a>         <strong class="jxr_keyword">if</strong> (errors.size() == 0) {
<a name="2531" href="#2531">2531</a>             newCategory = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a>();
<a name="2532" href="#2532">2532</a>             newCategory.setName(name);
<a name="2533" href="#2533">2533</a>         }
<a name="2534" href="#2534">2534</a> 
<a name="2535" href="#2535">2535</a>         Writer writer = response.getWriter();
<a name="2536" href="#2536">2536</a>         writeHeader(writer, TAB_VIEW_CATEGORIES);
<a name="2537" href="#2537">2537</a> 
<a name="2538" href="#2538">2538</a>         <strong class="jxr_keyword">if</strong> (errors.size() &gt; 0) {
<a name="2539" href="#2539">2539</a>             writer.write(<span class="jxr_string">"&lt;b&gt;There were errors adding your category:&lt;/b&gt;&lt;p&gt;"</span>);
<a name="2540" href="#2540">2540</a>             writeErrors(writer, errors);
<a name="2541" href="#2541">2541</a>             writer.write(<span class="jxr_string">"&lt;p&gt;"</span>);
<a name="2542" href="#2542">2542</a>             writer.write(<span class="jxr_string">"&lt;form action='/?action=addcategory' method='post'&gt;"</span>);
<a name="2543" href="#2543">2543</a>             writer.write(<span class="jxr_string">"&lt;table class='tableborder'&gt;"</span>);
<a name="2544" href="#2544">2544</a>             writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2'&gt;Add Category&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2545" href="#2545">2545</a>             writer.write(
<a name="2546" href="#2546">2546</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Category Newsgroup Name:&lt;/td&gt;&lt;td class='row2'&gt;&lt;input type='text' name='name' size='64' value='"</span>
<a name="2547" href="#2547">2547</a>                     + HTMLHelper.escapeString(name)
<a name="2548" href="#2548">2548</a>                     + <span class="jxr_string">"'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2549" href="#2549">2549</a>             writer.write(
<a name="2550" href="#2550">2550</a>                 <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' value='Add'&gt; &lt;input type='reset'&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>);
<a name="2551" href="#2551">2551</a>             writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="2552" href="#2552">2552</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2553" href="#2553">2553</a>             channelManager.addCategory(newCategory);
<a name="2554" href="#2554">2554</a>             writer.write(
<a name="2555" href="#2555">2555</a>                 <span class="jxr_string">"Category "</span>
<a name="2556" href="#2556">2556</a>                     + newCategory.getName()
<a name="2557" href="#2557">2557</a>                     + <span class="jxr_string">" successfully added.&lt;p&gt;"</span>);
<a name="2558" href="#2558">2558</a>         }
<a name="2559" href="#2559">2559</a> 
<a name="2560" href="#2560">2560</a>         writeFooter(writer);
<a name="2561" href="#2561">2561</a>         writer.flush();
<a name="2562" href="#2562">2562</a>     }
<a name="2563" href="#2563">2563</a> 
<a name="2564" href="#2564">2564</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdExportChannelConfig(
<a name="2565" href="#2565">2565</a>         HttpServletResponse response)
<a name="2566" href="#2566">2566</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2567" href="#2567">2567</a> 
<a name="2568" href="#2568">2568</a>         <em class="jxr_comment">//		response.setContentType("text/xml");</em>
<a name="2569" href="#2569">2569</a>         response.setContentType(<span class="jxr_string">"application/octet-stream"</span>);
<a name="2570" href="#2570">2570</a>         response.setHeader(
<a name="2571" href="#2571">2571</a>             <span class="jxr_string">"Content-Disposition"</span>,
<a name="2572" href="#2572">2572</a>             <span class="jxr_string">"attachment; filename=\&quot;nntprss-channels.xml\&quot;"</span>);
<a name="2573" href="#2573">2573</a>         PrintWriter writer = <strong class="jxr_keyword">new</strong> PrintWriter(response.getWriter());
<a name="2574" href="#2574">2574</a>         writer.println(<span class="jxr_string">"&lt;?xml version='1.0' encoding='UTF-8'?&gt;"</span>);
<a name="2575" href="#2575">2575</a>         writer.println();
<a name="2576" href="#2576">2576</a>         writer.println(<span class="jxr_string">"&lt;!-- Generated on "</span> + <strong class="jxr_keyword">new</strong> Date().toString() + <span class="jxr_string">" --&gt;"</span>);
<a name="2577" href="#2577">2577</a>         writer.println(
<a name="2578" href="#2578">2578</a>             <span class="jxr_string">"&lt;nntprss-channels nntprss-version='"</span>
<a name="2579" href="#2579">2579</a>                 + XMLHelper.escapeString(AppConstants.VERSION)
<a name="2580" href="#2580">2580</a>                 + <span class="jxr_string">"'&gt;"</span>);
<a name="2581" href="#2581">2581</a> 
<a name="2582" href="#2582">2582</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2583" href="#2583">2583</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2584" href="#2584">2584</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2585" href="#2585">2585</a> 
<a name="2586" href="#2586">2586</a>         Iterator channelIter = channelManager.channels();
<a name="2587" href="#2587">2587</a>         <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="2588" href="#2588">2588</a>             <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = (Channel) channelIter.next();
<a name="2589" href="#2589">2589</a>             writer.print(<span class="jxr_string">"  &lt;channel name='"</span>);
<a name="2590" href="#2590">2590</a>             writer.print(XMLHelper.escapeString(channel.getName()));
<a name="2591" href="#2591">2591</a>             writer.print(<span class="jxr_string">"' url='"</span>);
<a name="2592" href="#2592">2592</a>             writer.print(XMLHelper.escapeString(channel.getUrl()));
<a name="2593" href="#2593">2593</a>             writer.print(<span class="jxr_string">"' expiration='"</span>);
<a name="2594" href="#2594">2594</a>             writer.print(channel.getExpiration());
<a name="2595" href="#2595">2595</a>             writer.print(<span class="jxr_string">"' "</span>);
<a name="2596" href="#2596">2596</a>             <strong class="jxr_keyword">if</strong> (channel.getCategory() != <strong class="jxr_keyword">null</strong>) {
<a name="2597" href="#2597">2597</a>                 writer.print(<span class="jxr_string">" category='"</span>);
<a name="2598" href="#2598">2598</a>                 writer.print(channel.getCategory().getName());
<a name="2599" href="#2599">2599</a>                 writer.print(<span class="jxr_string">"' "</span>);
<a name="2600" href="#2600">2600</a>             }
<a name="2601" href="#2601">2601</a>             writer.println(<span class="jxr_string">"/&gt;"</span>);
<a name="2602" href="#2602">2602</a>         }
<a name="2603" href="#2603">2603</a> 
<a name="2604" href="#2604">2604</a>         writer.println(<span class="jxr_string">"&lt;/nntprss-channels&gt;"</span>);
<a name="2605" href="#2605">2605</a>     }
<a name="2606" href="#2606">2606</a> 
<a name="2607" href="#2607">2607</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdExportOpmlChannelConfig(
<a name="2608" href="#2608">2608</a>         HttpServletResponse response)
<a name="2609" href="#2609">2609</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2610" href="#2610">2610</a> 
<a name="2611" href="#2611">2611</a>         <em class="jxr_comment">//		response.setContentType("text/xml");</em>
<a name="2612" href="#2612">2612</a>         response.setContentType(<span class="jxr_string">"application/octet-stream; charset=UTF-8"</span>);
<a name="2613" href="#2613">2613</a>         response.setHeader(
<a name="2614" href="#2614">2614</a>             <span class="jxr_string">"Content-Disposition"</span>,
<a name="2615" href="#2615">2615</a>             <span class="jxr_string">"attachment; filename=\&quot;nntprss-channels-opml.xml\&quot;"</span>);
<a name="2616" href="#2616">2616</a>         PrintWriter writer = <strong class="jxr_keyword">new</strong> PrintWriter(response.getWriter());
<a name="2617" href="#2617">2617</a>         writer.println(<span class="jxr_string">"&lt;?xml version='1.0' encoding='UTF-8'?&gt;"</span>);
<a name="2618" href="#2618">2618</a>         writer.println();
<a name="2619" href="#2619">2619</a>         writer.println(<span class="jxr_string">"&lt;!-- Generated on "</span> + <strong class="jxr_keyword">new</strong> Date().toString() + <span class="jxr_string">" --&gt;"</span>);
<a name="2620" href="#2620">2620</a>         writer.println(
<a name="2621" href="#2621">2621</a>             <span class="jxr_string">"&lt;!-- nntp//rss v"</span>
<a name="2622" href="#2622">2622</a>                 + XMLHelper.escapeString(AppConstants.VERSION)
<a name="2623" href="#2623">2623</a>                 + <span class="jxr_string">" - http://www.methodize.org/nntprss/ --&gt;"</span>);
<a name="2624" href="#2624">2624</a> 
<a name="2625" href="#2625">2625</a>         writer.println(<span class="jxr_string">"&lt;opml version='1.1'&gt;"</span>);
<a name="2626" href="#2626">2626</a>         writer.println(<span class="jxr_string">" &lt;head&gt;"</span>);
<a name="2627" href="#2627">2627</a>         writer.println(<span class="jxr_string">"  &lt;title&gt;My nntp//rss Subscriptions&lt;/title&gt;"</span>);
<a name="2628" href="#2628">2628</a> 
<a name="2629" href="#2629">2629</a>         MailDateFormat mailDateFormat = <strong class="jxr_keyword">new</strong> MailDateFormat();
<a name="2630" href="#2630">2630</a>         String currentDateTime = mailDateFormat.format(<strong class="jxr_keyword">new</strong> Date());
<a name="2631" href="#2631">2631</a>         writer.println(<span class="jxr_string">"  &lt;dateCreated&gt;"</span> + currentDateTime + <span class="jxr_string">"&lt;/dateCreated&gt;"</span>);
<a name="2632" href="#2632">2632</a>         writer.println(
<a name="2633" href="#2633">2633</a>             <span class="jxr_string">"  &lt;dateModified&gt;"</span> + currentDateTime + <span class="jxr_string">"&lt;/dateModified&gt;"</span>);
<a name="2634" href="#2634">2634</a>         writer.println(<span class="jxr_string">" &lt;/head&gt;"</span>);
<a name="2635" href="#2635">2635</a>         writer.println(<span class="jxr_string">" &lt;body&gt;"</span>);
<a name="2636" href="#2636">2636</a> 
<a name="2637" href="#2637">2637</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2638" href="#2638">2638</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2639" href="#2639">2639</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2640" href="#2640">2640</a> 
<a name="2641" href="#2641">2641</a>         Iterator channelIter = channelManager.channels();
<a name="2642" href="#2642">2642</a>         <strong class="jxr_keyword">while</strong> (channelIter.hasNext()) {
<a name="2643" href="#2643">2643</a>             <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> channel = (Channel) channelIter.next();
<a name="2644" href="#2644">2644</a>             writer.print(<span class="jxr_string">"  &lt;outline text='"</span>);
<a name="2645" href="#2645">2645</a>             writer.print(channel.getTitle() != <strong class="jxr_keyword">null</strong> ? XMLHelper.escapeString(channel.getTitle()) : <span class="jxr_string">""</span>);
<a name="2646" href="#2646">2646</a>             writer.print(<span class="jxr_string">"' description='"</span>);
<a name="2647" href="#2647">2647</a>             writer.print(channel.getDescription() != <strong class="jxr_keyword">null</strong> ? XMLHelper.escapeString(channel.getDescription()) : <span class="jxr_string">""</span>);
<a name="2648" href="#2648">2648</a>             writer.print(<span class="jxr_string">"' htmlUrl='"</span>);
<a name="2649" href="#2649">2649</a>             writer.print(channel.getLink() != <strong class="jxr_keyword">null</strong> ? XMLHelper.escapeString(channel.getLink()) : <span class="jxr_string">""</span>);
<a name="2650" href="#2650">2650</a>             writer.print(<span class="jxr_string">"' title='"</span>);
<a name="2651" href="#2651">2651</a>             writer.print(channel.getTitle() != <strong class="jxr_keyword">null</strong> ? XMLHelper.escapeString(channel.getTitle()) : <span class="jxr_string">""</span>);
<a name="2652" href="#2652">2652</a>             writer.print(<span class="jxr_string">"' "</span>);
<a name="2653" href="#2653">2653</a>             <strong class="jxr_keyword">if</strong> (channel.getRssVersion() != <strong class="jxr_keyword">null</strong>) {
<a name="2654" href="#2654">2654</a>                 <strong class="jxr_keyword">if</strong> (channel.getRssVersion().toUpperCase().startsWith(<span class="jxr_string">"RSS"</span>)
<a name="2655" href="#2655">2655</a>                     || channel.getRssVersion().startsWith(<span class="jxr_string">"RDF"</span>)) {
<a name="2656" href="#2656">2656</a>                     writer.print(<span class="jxr_string">"type='rss' version='RSS' "</span>);
<a name="2657" href="#2657">2657</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2658" href="#2658">2658</a>                     channel.getRssVersion().toUpperCase().startsWith(<span class="jxr_string">"ATOM"</span>)) {
<a name="2659" href="#2659">2659</a>                     writer.print(<span class="jxr_string">"type='atom' version='ATOM' "</span>);
<a name="2660" href="#2660">2660</a>                 }
<a name="2661" href="#2661">2661</a>             }
<a name="2662" href="#2662">2662</a>             writer.print(<span class="jxr_string">"xmlUrl='"</span>);
<a name="2663" href="#2663">2663</a>             writer.print(XMLHelper.escapeString(channel.getUrl()));
<a name="2664" href="#2664">2664</a>             writer.println(<span class="jxr_string">"'/&gt;"</span>);
<a name="2665" href="#2665">2665</a>         }
<a name="2666" href="#2666">2666</a> 
<a name="2667" href="#2667">2667</a>         writer.println(<span class="jxr_string">" &lt;/body&gt;"</span>);
<a name="2668" href="#2668">2668</a>         writer.println(<span class="jxr_string">"&lt;/opml&gt;"</span>);
<a name="2669" href="#2669">2669</a>     }
<a name="2670" href="#2670">2670</a> 
<a name="2671" href="#2671">2671</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> writeImportForm(Writer writer) <strong class="jxr_keyword">throws</strong> IOException {
<a name="2672" href="#2672">2672</a>         writer.write(
<a name="2673" href="#2673">2673</a>             <span class="jxr_string">"&lt;form action='?action=import' method='POST' enctype='multipart/form-data'&gt;"</span>);
<a name="2674" href="#2674">2674</a>         writer.write(<span class="jxr_string">"&lt;table class='tableBorder'&gt;"</span>);
<a name="2675" href="#2675">2675</a> 
<a name="2676" href="#2676">2676</a>         writer.write(
<a name="2677" href="#2677">2677</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th colspan='2' class='tableHead'&gt;Import Channel List&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2678" href="#2678">2678</a> 
<a name="2679" href="#2679">2679</a>         writer.write(
<a name="2680" href="#2680">2680</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Channel List File&lt;/td&gt;"</span>);
<a name="2681" href="#2681">2681</a>         writer.write(
<a name="2682" href="#2682">2682</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='file' name='file'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2683" href="#2683">2683</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;td class='row1' align='right'&gt;Format&lt;/td&gt;"</span>);
<a name="2684" href="#2684">2684</a>         writer.write(
<a name="2685" href="#2685">2685</a>             <span class="jxr_string">"&lt;td class='row2'&gt;&lt;input type='radio' name='type' value='nntp' checked&gt;nntp//rss Channel List&lt;br&gt;"</span>
<a name="2686" href="#2686">2686</a>                 + <span class="jxr_string">"&lt;input type='radio' name='type' value='opml'&gt;OPML (mySubscriptions.opml)&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2687" href="#2687">2687</a> 
<a name="2688" href="#2688">2688</a>         writer.write(
<a name="2689" href="#2689">2689</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td class='row2' align='center' colspan='2'&gt;&lt;input type='submit' value='Import'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="2690" href="#2690">2690</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="2691" href="#2691">2691</a>         writer.write(<span class="jxr_string">"&lt;/form&gt;"</span>);
<a name="2692" href="#2692">2692</a>     }
<a name="2693" href="#2693">2693</a> 
<a name="2694" href="#2694">2694</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdImportChannelConfigForm(
<a name="2695" href="#2695">2695</a>         HttpServletResponse response)
<a name="2696" href="#2696">2696</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2697" href="#2697">2697</a> 
<a name="2698" href="#2698">2698</a>         Writer writer = response.getWriter();
<a name="2699" href="#2699">2699</a>         writeHeader(writer, TAB_CONFIG);
<a name="2700" href="#2700">2700</a> 
<a name="2701" href="#2701">2701</a>         writeImportForm(writer);
<a name="2702" href="#2702">2702</a> 
<a name="2703" href="#2703">2703</a>         writeFooter(writer);
<a name="2704" href="#2704">2704</a>         writer.flush();
<a name="2705" href="#2705">2705</a> 
<a name="2706" href="#2706">2706</a>     }
<a name="2707" href="#2707">2707</a> 
<a name="2708" href="#2708">2708</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdImportChannelConfig(
<a name="2709" href="#2709">2709</a>         HttpServletRequest request,
<a name="2710" href="#2710">2710</a>         HttpServletResponse response)
<a name="2711" href="#2711">2711</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2712" href="#2712">2712</a> 
<a name="2713" href="#2713">2713</a>         MultiPartRequest mpRequest = <strong class="jxr_keyword">new</strong> MultiPartRequest(request);
<a name="2714" href="#2714">2714</a> 
<a name="2715" href="#2715">2715</a>         <strong class="jxr_keyword">if</strong> (mpRequest.getString(<span class="jxr_string">"type"</span>).equalsIgnoreCase(<span class="jxr_string">"opml"</span>)) {
<a name="2716" href="#2716">2716</a>             cmdImportOpmlChannelConfigValidate(response, mpRequest);
<a name="2717" href="#2717">2717</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2718" href="#2718">2718</a>             cmdImportNntpRssChannelConfig(response, mpRequest);
<a name="2719" href="#2719">2719</a>         }
<a name="2720" href="#2720">2720</a>     }
<a name="2721" href="#2721">2721</a> 
<a name="2722" href="#2722">2722</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdImportNntpRssChannelConfig(
<a name="2723" href="#2723">2723</a>         HttpServletResponse response,
<a name="2724" href="#2724">2724</a>         MultiPartRequest mpRequest)
<a name="2725" href="#2725">2725</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2726" href="#2726">2726</a> 
<a name="2727" href="#2727">2727</a>         Writer writer = response.getWriter();
<a name="2728" href="#2728">2728</a>         writeHeader(writer, TAB_CONFIG);
<a name="2729" href="#2729">2729</a> 
<a name="2730" href="#2730">2730</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="2731" href="#2731">2731</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="2732" href="#2732">2732</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="2733" href="#2733">2733</a> 
<a name="2734" href="#2734">2734</a>         writer.write(<span class="jxr_string">"&lt;b&gt;Import status&lt;/b&gt;&lt;p&gt;"</span>);
<a name="2735" href="#2735">2735</a> 
<a name="2736" href="#2736">2736</a>         List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="2737" href="#2737">2737</a>         <strong class="jxr_keyword">int</strong> channelsAdded = 0;
<a name="2738" href="#2738">2738</a> 
<a name="2739" href="#2739">2739</a>         <em class="jxr_comment">// Parse XML</em>
<a name="2740" href="#2740">2740</a>         <strong class="jxr_keyword">try</strong> {
<a name="2741" href="#2741">2741</a>             DocumentBuilder db = AppConstants.newDocumentBuilder();
<a name="2742" href="#2742">2742</a>             Document doc = db.parse(mpRequest.getInputStream(<span class="jxr_string">"file"</span>));
<a name="2743" href="#2743">2743</a>             Element docElm = doc.getDocumentElement();
<a name="2744" href="#2744">2744</a>             NodeList channels = docElm.getElementsByTagName(<span class="jxr_string">"channel"</span>);
<a name="2745" href="#2745">2745</a> 
<a name="2746" href="#2746">2746</a>             <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> channelCount = 0;
<a name="2747" href="#2747">2747</a>                 channelCount &lt; channels.getLength();
<a name="2748" href="#2748">2748</a>                 channelCount++) {
<a name="2749" href="#2749">2749</a>                 Element chanElm = (Element) channels.item(channelCount);
<a name="2750" href="#2750">2750</a> 
<a name="2751" href="#2751">2751</a>                 String name = chanElm.getAttribute(<span class="jxr_string">"name"</span>);
<a name="2752" href="#2752">2752</a>                 String urlString = chanElm.getAttribute(<span class="jxr_string">"url"</span>);
<a name="2753" href="#2753">2753</a>                 <strong class="jxr_keyword">boolean</strong> historical = false;
<a name="2754" href="#2754">2754</a>                 Node historicalNode = chanElm.getAttributeNode(<span class="jxr_string">"historical"</span>);
<a name="2755" href="#2755">2755</a>                 <strong class="jxr_keyword">if</strong> (historicalNode != <strong class="jxr_keyword">null</strong>) {
<a name="2756" href="#2756">2756</a>                     historical =
<a name="2757" href="#2757">2757</a>                         historicalNode.getNodeValue().equalsIgnoreCase(<span class="jxr_string">"true"</span>);
<a name="2758" href="#2758">2758</a>                 }
<a name="2759" href="#2759">2759</a> 
<a name="2760" href="#2760">2760</a>                 <strong class="jxr_keyword">long</strong> expiration = Channel.EXPIRATION_KEEP;
<a name="2761" href="#2761">2761</a>                 Node expirationNode = chanElm.getAttributeNode(<span class="jxr_string">"expiration"</span>);
<a name="2762" href="#2762">2762</a>                 <strong class="jxr_keyword">if</strong> (expirationNode != <strong class="jxr_keyword">null</strong>) {
<a name="2763" href="#2763">2763</a>                     expiration = Long.parseLong(expirationNode.getNodeValue());
<a name="2764" href="#2764">2764</a>                 } <strong class="jxr_keyword">else</strong> {
<a name="2765" href="#2765">2765</a>                     expiration = historical ? Channel.EXPIRATION_KEEP : 0;
<a name="2766" href="#2766">2766</a>                 }
<a name="2767" href="#2767">2767</a> 
<a name="2768" href="#2768">2768</a>                 String categoryName = chanElm.getAttribute(<span class="jxr_string">"category"</span>);
<a name="2769" href="#2769">2769</a> 
<a name="2770" href="#2770">2770</a>                 <em class="jxr_comment">// Check name...</em>
<a name="2771" href="#2771">2771</a>                 List currentErrors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="2772" href="#2772">2772</a>                 <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> existingChannel = channelManager.channelByName(name);
<a name="2773" href="#2773">2773</a> 
<a name="2774" href="#2774">2774</a>                 <strong class="jxr_keyword">if</strong> (name.length() == 0) {
<a name="2775" href="#2775">2775</a>                     currentErrors.add(
<a name="2776" href="#2776">2776</a>                         <span class="jxr_string">"Channel with empty name - URL="</span> + urlString);
<a name="2777" href="#2777">2777</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (name.indexOf(' ') &gt; -1) {
<a name="2778" href="#2778">2778</a>                     currentErrors.add(
<a name="2779" href="#2779">2779</a>                         <span class="jxr_string">"Channel name cannot contain spaces - name="</span> + name);
<a name="2780" href="#2780">2780</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (existingChannel != <strong class="jxr_keyword">null</strong>) {
<a name="2781" href="#2781">2781</a>                     currentErrors.add(
<a name="2782" href="#2782">2782</a>                         <span class="jxr_string">"Channel name "</span> + name + <span class="jxr_string">" is already is use"</span>);
<a name="2783" href="#2783">2783</a>                 }
<a name="2784" href="#2784">2784</a> 
<a name="2785" href="#2785">2785</a>                 <strong class="jxr_keyword">if</strong> (urlString.length() == 0) {
<a name="2786" href="#2786">2786</a>                     currentErrors.add(
<a name="2787" href="#2787">2787</a>                         <span class="jxr_string">"URL cannot be empty, channel name="</span> + name);
<a name="2788" href="#2788">2788</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2789" href="#2789">2789</a>                     urlString.equals(<span class="jxr_string">"http://"</span>)
<a name="2790" href="#2790">2790</a>                         || urlString.equals(<span class="jxr_string">"https://"</span>)) {
<a name="2791" href="#2791">2791</a>                     currentErrors.add(
<a name="2792" href="#2792">2792</a>                         <span class="jxr_string">"You must specify a URL, channel name="</span> + name);
<a name="2793" href="#2793">2793</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="2794" href="#2794">2794</a>                     !urlString.startsWith(<span class="jxr_string">"http://"</span>)
<a name="2795" href="#2795">2795</a>                         &amp;&amp; !urlString.startsWith(<span class="jxr_string">"https://"</span>)) {
<a name="2796" href="#2796">2796</a>                     currentErrors.add(
<a name="2797" href="#2797">2797</a>                         <span class="jxr_string">"Only URLs starting http:// or https:// are supported, channel name="</span>
<a name="2798" href="#2798">2798</a>                             + name
<a name="2799" href="#2799">2799</a>                             + <span class="jxr_string">", url="</span>
<a name="2800" href="#2800">2800</a>                             + urlString);
<a name="2801" href="#2801">2801</a>                 }
<a name="2802" href="#2802">2802</a> 
<a name="2803" href="#2803">2803</a>                 <strong class="jxr_keyword">if</strong> (existingChannel == <strong class="jxr_keyword">null</strong>) {
<a name="2804" href="#2804">2804</a> 
<a name="2805" href="#2805">2805</a>                     <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> newChannel = <strong class="jxr_keyword">null</strong>;
<a name="2806" href="#2806">2806</a>                     <strong class="jxr_keyword">if</strong> (currentErrors.size() == 0) {
<a name="2807" href="#2807">2807</a>                         <strong class="jxr_keyword">try</strong> {
<a name="2808" href="#2808">2808</a>                             newChannel = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a>(name, urlString);
<a name="2809" href="#2809">2809</a>                             <em class="jxr_comment">//							newChannel.setHistorical(historical);</em>
<a name="2810" href="#2810">2810</a>                             newChannel.setExpiration(expiration);
<a name="2811" href="#2811">2811</a>                             channelManager.addChannel(newChannel);
<a name="2812" href="#2812">2812</a>                             channelsAdded++;
<a name="2813" href="#2813">2813</a>                         } <strong class="jxr_keyword">catch</strong> (MalformedURLException me) {
<a name="2814" href="#2814">2814</a>                             errors.add(
<a name="2815" href="#2815">2815</a>                                 <span class="jxr_string">"Channel "</span>
<a name="2816" href="#2816">2816</a>                                     + name
<a name="2817" href="#2817">2817</a>                                     + <span class="jxr_string">" - URL ("</span>
<a name="2818" href="#2818">2818</a>                                     + urlString
<a name="2819" href="#2819">2819</a>                                     + <span class="jxr_string">") is malformed"</span>);
<a name="2820" href="#2820">2820</a>                         }
<a name="2821" href="#2821">2821</a>                     }
<a name="2822" href="#2822">2822</a> 
<a name="2823" href="#2823">2823</a>                     <strong class="jxr_keyword">if</strong> (categoryName.length() &gt; 0) {
<a name="2824" href="#2824">2824</a>                         <em class="jxr_comment">//Handle category...</em>
<a name="2825" href="#2825">2825</a>                         <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a> category =
<a name="2826" href="#2826">2826</a>                             channelManager.categoryByName(categoryName);
<a name="2827" href="#2827">2827</a>                         <strong class="jxr_keyword">if</strong> (category == <strong class="jxr_keyword">null</strong>) {
<a name="2828" href="#2828">2828</a>                             <em class="jxr_comment">// Need to create category...</em>
<a name="2829" href="#2829">2829</a>                             category = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/Category.html">Category</a>();
<a name="2830" href="#2830">2830</a>                             category.setName(categoryName);
<a name="2831" href="#2831">2831</a>                             channelManager.addCategory(category);
<a name="2832" href="#2832">2832</a>                         }
<a name="2833" href="#2833">2833</a>                         category.addChannel(newChannel);
<a name="2834" href="#2834">2834</a>                         newChannel.setCategory(category);
<a name="2835" href="#2835">2835</a>                         newChannel.save();
<a name="2836" href="#2836">2836</a>                     }
<a name="2837" href="#2837">2837</a> 
<a name="2838" href="#2838">2838</a>                     <em class="jxr_comment">// Removed channel validation... channels will be validated</em>
<a name="2839" href="#2839">2839</a>                     <em class="jxr_comment">// on next iteration of channel poller - will be highlighted</em>
<a name="2840" href="#2840">2840</a>                     <em class="jxr_comment">// in channel list if invalid</em>
<a name="2841" href="#2841">2841</a>                     <em class="jxr_comment">// Validate channel...</em>
<a name="2842" href="#2842">2842</a>                     <em class="jxr_comment">//					if(Channel.isValid(new URL(urlString))) {</em>
<a name="2843" href="#2843">2843</a>                     <em class="jxr_comment">//// Add channel...</em>
<a name="2844" href="#2844">2844</a>                     <em class="jxr_comment">//						Channel newChannel = null;</em>
<a name="2845" href="#2845">2845</a>                     <em class="jxr_comment">//						if(currentErrors.size() == 0) {</em>
<a name="2846" href="#2846">2846</a>                     <em class="jxr_comment">//							try {</em>
<a name="2847" href="#2847">2847</a>                     <em class="jxr_comment">//								newChannel = new Channel(name, urlString);</em>
<a name="2848" href="#2848">2848</a>                     <em class="jxr_comment">//								newChannel.setHistorical(historical);</em>
<a name="2849" href="#2849">2849</a>                     <em class="jxr_comment">//								channelManager.addChannel(newChannel);</em>
<a name="2850" href="#2850">2850</a>                     <em class="jxr_comment">//								channelsAdded++;</em>
<a name="2851" href="#2851">2851</a>                     <em class="jxr_comment">//							} catch(MalformedURLException me) {</em>
<a name="2852" href="#2852">2852</a>                     <em class="jxr_comment">//								errors.add("Channel " + name + " - URL (" </em>
<a name="2853" href="#2853">2853</a>                     <em class="jxr_comment">//									+ urlString + ") is malformed");</em>
<a name="2854" href="#2854">2854</a>                     <em class="jxr_comment">//							}</em>
<a name="2855" href="#2855">2855</a>                     <em class="jxr_comment">//						}				</em>
<a name="2856" href="#2856">2856</a>                     <em class="jxr_comment">//						</em>
<a name="2857" href="#2857">2857</a>                     <em class="jxr_comment">//					} else {</em>
<a name="2858" href="#2858">2858</a>                     <em class="jxr_comment">//// URL points to invalid document</em>
<a name="2859" href="#2859">2859</a>                     <em class="jxr_comment">//						errors.add("Channel " + name + "'s URL (" + urlString + ") "</em>
<a name="2860" href="#2860">2860</a>                     <em class="jxr_comment">//							+ "points to an invalid document");</em>
<a name="2861" href="#2861">2861</a>                     <em class="jxr_comment">//					}</em>
<a name="2862" href="#2862">2862</a>                 }
<a name="2863" href="#2863">2863</a> 
<a name="2864" href="#2864">2864</a>                 errors.addAll(currentErrors);
<a name="2865" href="#2865">2865</a> 
<a name="2866" href="#2866">2866</a>             }
<a name="2867" href="#2867">2867</a>         } <strong class="jxr_keyword">catch</strong> (SAXException se) {
<a name="2868" href="#2868">2868</a>             errors.add(
<a name="2869" href="#2869">2869</a>                 <span class="jxr_string">"There was an error parsing your channel file:&lt;br&gt;"</span>
<a name="2870" href="#2870">2870</a>                     + se.getMessage());
<a name="2871" href="#2871">2871</a>         } <strong class="jxr_keyword">catch</strong> (ParserConfigurationException pce) {
<a name="2872" href="#2872">2872</a>             errors.add(
<a name="2873" href="#2873">2873</a>                 <span class="jxr_string">"There was a problem reading your channelf file:&lt;br&gt;"</span>
<a name="2874" href="#2874">2874</a>                     + pce.getMessage());
<a name="2875" href="#2875">2875</a>         }
<a name="2876" href="#2876">2876</a> 
<a name="2877" href="#2877">2877</a>         <em class="jxr_comment">// Display any errors encountered during parsing...</em>
<a name="2878" href="#2878">2878</a>         <strong class="jxr_keyword">if</strong> (errors.size() &gt; 0) {
<a name="2879" href="#2879">2879</a>             writer.write(<span class="jxr_string">"Problems were encountered while adding channels.&lt;p&gt;"</span>);
<a name="2880" href="#2880">2880</a>             writeErrors(writer, errors);
<a name="2881" href="#2881">2881</a> 
<a name="2882" href="#2882">2882</a>             <strong class="jxr_keyword">if</strong> (channelsAdded &gt; 0) {
<a name="2883" href="#2883">2883</a>                 writer.write(
<a name="2884" href="#2884">2884</a>                     <span class="jxr_string">"&lt;p&gt;"</span>
<a name="2885" href="#2885">2885</a>                         + channelsAdded
<a name="2886" href="#2886">2886</a>                         + <span class="jxr_string">" channel(s) were successfully imported."</span>);
<a name="2887" href="#2887">2887</a>             }
<a name="2888" href="#2888">2888</a>         } <strong class="jxr_keyword">else</strong> {
<a name="2889" href="#2889">2889</a>             <strong class="jxr_keyword">if</strong> (channelsAdded &gt; 0) {
<a name="2890" href="#2890">2890</a>                 writer.write(
<a name="2891" href="#2891">2891</a>                     <span class="jxr_string">"&lt;p&gt;"</span>
<a name="2892" href="#2892">2892</a>                         + channelsAdded
<a name="2893" href="#2893">2893</a>                         + <span class="jxr_string">" channel(s) were successfully imported."</span>);
<a name="2894" href="#2894">2894</a>             } <strong class="jxr_keyword">else</strong> {
<a name="2895" href="#2895">2895</a>                 writer.write(
<a name="2896" href="#2896">2896</a>                     <span class="jxr_string">"The configuration file did not contain any channels!"</span>);
<a name="2897" href="#2897">2897</a>             }
<a name="2898" href="#2898">2898</a>         }
<a name="2899" href="#2899">2899</a> 
<a name="2900" href="#2900">2900</a>         writeFooter(writer);
<a name="2901" href="#2901">2901</a>         writer.flush();
<a name="2902" href="#2902">2902</a> 
<a name="2903" href="#2903">2903</a>     }
<a name="2904" href="#2904">2904</a> 
<a name="2905" href="#2905">2905</a>     <strong class="jxr_keyword">private</strong> String fixChannelName(String channelName) {
<a name="2906" href="#2906">2906</a>         StringBuffer fixedName = <strong class="jxr_keyword">new</strong> StringBuffer();
<a name="2907" href="#2907">2907</a> 
<a name="2908" href="#2908">2908</a>         <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; channelName.length(); i++) {
<a name="2909" href="#2909">2909</a>             <strong class="jxr_keyword">char</strong> c = channelName.charAt(i);
<a name="2910" href="#2910">2910</a>             <strong class="jxr_keyword">if</strong> (Character.isWhitespace(c)) {
<a name="2911" href="#2911">2911</a>                 fixedName.append(<span class="jxr_string">"_"</span>);
<a name="2912" href="#2912">2912</a>             } <strong class="jxr_keyword">else</strong> {
<a name="2913" href="#2913">2913</a>                 fixedName.append(c);
<a name="2914" href="#2914">2914</a>             }
<a name="2915" href="#2915">2915</a>         }
<a name="2916" href="#2916">2916</a>         <strong class="jxr_keyword">return</strong> fixedName.toString().trim();
<a name="2917" href="#2917">2917</a>     }
<a name="2918" href="#2918">2918</a> 
<a name="2919" href="#2919">2919</a>     <strong class="jxr_keyword">private</strong> String createChannelName(String urlString) {
<a name="2920" href="#2920">2920</a>         String name = <strong class="jxr_keyword">null</strong>;
<a name="2921" href="#2921">2921</a>         <strong class="jxr_keyword">try</strong> {
<a name="2922" href="#2922">2922</a>             URL url = <strong class="jxr_keyword">new</strong> URL(urlString);
<a name="2923" href="#2923">2923</a>             String host = url.getHost();
<a name="2924" href="#2924">2924</a>             Stack hostStack = <strong class="jxr_keyword">new</strong> Stack();
<a name="2925" href="#2925">2925</a>             StringTokenizer hostTok = <strong class="jxr_keyword">new</strong> StringTokenizer(host, <span class="jxr_string">"."</span>);
<a name="2926" href="#2926">2926</a>             <strong class="jxr_keyword">while</strong> (hostTok.hasMoreTokens()) {
<a name="2927" href="#2927">2927</a>                 String token = hostTok.nextToken();
<a name="2928" href="#2928">2928</a>                 hostStack.push(token);
<a name="2929" href="#2929">2929</a>             }
<a name="2930" href="#2930">2930</a> 
<a name="2931" href="#2931">2931</a>             StringBuffer channelName = <strong class="jxr_keyword">new</strong> StringBuffer();
<a name="2932" href="#2932">2932</a>             <strong class="jxr_keyword">while</strong> (hostStack.size() &gt; 0) {
<a name="2933" href="#2933">2933</a>                 channelName.append(hostStack.pop());
<a name="2934" href="#2934">2934</a>                 <strong class="jxr_keyword">if</strong> (hostStack.size() &gt; 0) {
<a name="2935" href="#2935">2935</a>                     channelName.append('.');
<a name="2936" href="#2936">2936</a>                 }
<a name="2937" href="#2937">2937</a>             }
<a name="2938" href="#2938">2938</a> 
<a name="2939" href="#2939">2939</a>             name = channelName.toString();
<a name="2940" href="#2940">2940</a> 
<a name="2941" href="#2941">2941</a>         } <strong class="jxr_keyword">catch</strong> (MalformedURLException mue) {
<a name="2942" href="#2942">2942</a>             name = <span class="jxr_string">"Unnamed_Channel_"</span> + System.currentTimeMillis();
<a name="2943" href="#2943">2943</a>         }
<a name="2944" href="#2944">2944</a> 
<a name="2945" href="#2945">2945</a>         <strong class="jxr_keyword">return</strong> name;
<a name="2946" href="#2946">2946</a>     }
<a name="2947" href="#2947">2947</a> 
<a name="2948" href="#2948">2948</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdImportOpmlChannelConfigValidate(
<a name="2949" href="#2949">2949</a>         HttpServletResponse response,
<a name="2950" href="#2950">2950</a>         MultiPartRequest mpRequest)
<a name="2951" href="#2951">2951</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="2952" href="#2952">2952</a> 
<a name="2953" href="#2953">2953</a>         Writer writer = response.getWriter();
<a name="2954" href="#2954">2954</a>         writeHeader(writer, TAB_CONFIG);
<a name="2955" href="#2955">2955</a> 
<a name="2956" href="#2956">2956</a>         writeCheckboxSelector(writer, <span class="jxr_string">"checkAllImport"</span>, <span class="jxr_string">"import"</span>, <span class="jxr_string">"channels"</span>);
<a name="2957" href="#2957">2957</a> 
<a name="2958" href="#2958">2958</a>         writer.write(<span class="jxr_string">"&lt;b&gt;mySubscriptions.opml validation&lt;/b&gt;&lt;p&gt;"</span>);
<a name="2959" href="#2959">2959</a> 
<a name="2960" href="#2960">2960</a>         List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="2961" href="#2961">2961</a> 
<a name="2962" href="#2962">2962</a>         <em class="jxr_comment">// Parse XML</em>
<a name="2963" href="#2963">2963</a>         <strong class="jxr_keyword">try</strong> {
<a name="2964" href="#2964">2964</a>             DocumentBuilder db = AppConstants.newDocumentBuilder();
<a name="2965" href="#2965">2965</a>             Document doc = db.parse(mpRequest.getInputStream(<span class="jxr_string">"file"</span>));
<a name="2966" href="#2966">2966</a>             Element docElm = doc.getDocumentElement();
<a name="2967" href="#2967">2967</a> 
<a name="2968" href="#2968">2968</a>             NodeList channels = docElm.getElementsByTagName(<span class="jxr_string">"outline"</span>);
<a name="2969" href="#2969">2969</a>             <strong class="jxr_keyword">if</strong> (channels.getLength() &gt; 0) {
<a name="2970" href="#2970">2970</a> 
<a name="2971" href="#2971">2971</a>                 writer.write(
<a name="2972" href="#2972">2972</a>                     <span class="jxr_string">"&lt;form name='channels' action='?action=importopml' method='POST'&gt;"</span>);
<a name="2973" href="#2973">2973</a>                 writer.write(
<a name="2974" href="#2974">2974</a>                     <span class="jxr_string">"&lt;table class='tableBorder'&gt;&lt;tr&gt;&lt;th&gt;Import&lt;br&gt;"</span>
<a name="2975" href="#2975">2975</a>                         + <span class="jxr_string">"&lt;input type='checkbox' name='changeImport' onClick='checkAllImport(this);' checked&gt;"</span>
<a name="2976" href="#2976">2976</a>                         + <span class="jxr_string">"&lt;/th&gt;&lt;th&gt;Channel Name&lt;/th&gt;&lt;th&gt;Expiration"</span>
<a name="2977" href="#2977">2977</a>                         + <span class="jxr_string">"&lt;/th&gt;&lt;th&gt;URL&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="2978" href="#2978">2978</a> 
<a name="2979" href="#2979">2979</a>                 <strong class="jxr_keyword">int</strong> channelCount = 0;
<a name="2980" href="#2980">2980</a>                 <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> chlLoopCounter = 0;
<a name="2981" href="#2981">2981</a>                     chlLoopCounter &lt; channels.getLength();
<a name="2982" href="#2982">2982</a>                     chlLoopCounter++) {
<a name="2983" href="#2983">2983</a>                     Element chanElm = (Element) channels.item(chlLoopCounter);
<a name="2984" href="#2984">2984</a> 
<a name="2985" href="#2985">2985</a>                     String name = fixChannelName(chanElm.getAttribute(<span class="jxr_string">"title"</span>));
<a name="2986" href="#2986">2986</a>                     String urlString = chanElm.getAttribute(<span class="jxr_string">"xmlUrl"</span>);
<a name="2987" href="#2987">2987</a>                     <strong class="jxr_keyword">if</strong> (urlString == <strong class="jxr_keyword">null</strong> || urlString.length() == 0) {
<a name="2988" href="#2988">2988</a>                         urlString = chanElm.getAttribute(<span class="jxr_string">"xmlurl"</span>);
<a name="2989" href="#2989">2989</a>                     }
<a name="2990" href="#2990">2990</a> 
<a name="2991" href="#2991">2991</a>                     <strong class="jxr_keyword">if</strong> (urlString == <strong class="jxr_keyword">null</strong> || urlString.length() == 0) {
<a name="2992" href="#2992">2992</a>                         <strong class="jxr_keyword">continue</strong>;
<a name="2993" href="#2993">2993</a>                     }
<a name="2994" href="#2994">2994</a> 
<a name="2995" href="#2995">2995</a>                     <strong class="jxr_keyword">if</strong> (name.length() == 0) {
<a name="2996" href="#2996">2996</a>                         name = createChannelName(urlString);
<a name="2997" href="#2997">2997</a>                     }
<a name="2998" href="#2998">2998</a> 
<a name="2999" href="#2999">2999</a>                     String rowClass =
<a name="3000" href="#3000">3000</a>                         (((channelCount % 2) == 1) ? <span class="jxr_string">"row1"</span> : <span class="jxr_string">"row2"</span>);
<a name="3001" href="#3001">3001</a> 
<a name="3002" href="#3002">3002</a>                     writer.write(
<a name="3003" href="#3003">3003</a>                         <span class="jxr_string">"&lt;tr&gt;"</span>
<a name="3004" href="#3004">3004</a>                             + <span class="jxr_string">"&lt;td class='"</span>
<a name="3005" href="#3005">3005</a>                             + rowClass
<a name="3006" href="#3006">3006</a>                             + <span class="jxr_string">"' align='center'&gt;&lt;input type='checkbox' name='import"</span>
<a name="3007" href="#3007">3007</a>                             + channelCount
<a name="3008" href="#3008">3008</a>                             + <span class="jxr_string">"' checked&gt;&lt;/td&gt;"</span>
<a name="3009" href="#3009">3009</a>                             + <span class="jxr_string">"&lt;td class='"</span>
<a name="3010" href="#3010">3010</a>                             + rowClass
<a name="3011" href="#3011">3011</a>                             + <span class="jxr_string">"'&gt;&lt;input type='value' size='50' name='name"</span>
<a name="3012" href="#3012">3012</a>                             + channelCount
<a name="3013" href="#3013">3013</a>                             + <span class="jxr_string">"' value='"</span>
<a name="3014" href="#3014">3014</a>                             + HTMLHelper.escapeString(name)
<a name="3015" href="#3015">3015</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;"</span>
<a name="3016" href="#3016">3016</a>                             + <span class="jxr_string">"&lt;td class='"</span>
<a name="3017" href="#3017">3017</a>                             + rowClass
<a name="3018" href="#3018">3018</a>                             + <span class="jxr_string">"' align='center'&gt;"</span>
<a name="3019" href="#3019">3019</a>                             + <span class="jxr_string">"&lt;select name='expiration"</span>
<a name="3020" href="#3020">3020</a>                             + channelCount
<a name="3021" href="#3021">3021</a>                             + <span class="jxr_string">"'&gt;"</span>);
<a name="3022" href="#3022">3022</a> 
<a name="3023" href="#3023">3023</a>                     <strong class="jxr_keyword">long</strong> expiration = Channel.EXPIRATION_KEEP;
<a name="3024" href="#3024">3024</a> 
<a name="3025" href="#3025">3025</a>                     writeOption(
<a name="3026" href="#3026">3026</a>                         writer,
<a name="3027" href="#3027">3027</a>                         <span class="jxr_string">"Keep all items"</span>,
<a name="3028" href="#3028">3028</a>                         Channel.EXPIRATION_KEEP,
<a name="3029" href="#3029">3029</a>                         expiration);
<a name="3030" href="#3030">3030</a>                     writeOption(
<a name="3031" href="#3031">3031</a>                         writer,
<a name="3032" href="#3032">3032</a>                         <span class="jxr_string">"Keep only current items"</span>,
<a name="3033" href="#3033">3033</a>                         0,
<a name="3034" href="#3034">3034</a>                         expiration);
<a name="3035" href="#3035">3035</a>                     writeOption(
<a name="3036" href="#3036">3036</a>                         writer,
<a name="3037" href="#3037">3037</a>                         <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="3038" href="#3038">3038</a>                         (1000 * 60 * 60 * 24 * 1),
<a name="3039" href="#3039">3039</a>                         expiration);
<a name="3040" href="#3040">3040</a>                     writeOption(
<a name="3041" href="#3041">3041</a>                         writer,
<a name="3042" href="#3042">3042</a>                         <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="3043" href="#3043">3043</a>                         (1000 * 60 * 60 * 24 * 2),
<a name="3044" href="#3044">3044</a>                         expiration);
<a name="3045" href="#3045">3045</a>                     writeOption(
<a name="3046" href="#3046">3046</a>                         writer,
<a name="3047" href="#3047">3047</a>                         <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="3048" href="#3048">3048</a>                         (1000 * 60 * 60 * 24 * 4),
<a name="3049" href="#3049">3049</a>                         expiration);
<a name="3050" href="#3050">3050</a>                     writeOption(
<a name="3051" href="#3051">3051</a>                         writer,
<a name="3052" href="#3052">3052</a>                         <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="3053" href="#3053">3053</a>                         (1000 * 60 * 60 * 24 * 7),
<a name="3054" href="#3054">3054</a>                         expiration);
<a name="3055" href="#3055">3055</a>                     writeOption(
<a name="3056" href="#3056">3056</a>                         writer,
<a name="3057" href="#3057">3057</a>                         <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="3058" href="#3058">3058</a>                         (1000 * 60 * 60 * 24 * 14),
<a name="3059" href="#3059">3059</a>                         expiration);
<a name="3060" href="#3060">3060</a>                     writeOption(
<a name="3061" href="#3061">3061</a>                         writer,
<a name="3062" href="#3062">3062</a>                         <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="3063" href="#3063">3063</a>                         (1000 * 60 * 60 * 24 * 28),
<a name="3064" href="#3064">3064</a>                         expiration);
<a name="3065" href="#3065">3065</a> 
<a name="3066" href="#3066">3066</a>                     writer.write(
<a name="3067" href="#3067">3067</a>                         <span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;"</span>
<a name="3068" href="#3068">3068</a>                             + <span class="jxr_string">"&lt;td class='"</span>
<a name="3069" href="#3069">3069</a>                             + rowClass
<a name="3070" href="#3070">3070</a>                             + <span class="jxr_string">"' &gt;&lt;input type='hidden' name='url"</span>
<a name="3071" href="#3071">3071</a>                             + channelCount
<a name="3072" href="#3072">3072</a>                             + <span class="jxr_string">"' value='"</span>
<a name="3073" href="#3073">3073</a>                             + HTMLHelper.escapeString(urlString)
<a name="3074" href="#3074">3074</a>                             + <span class="jxr_string">"'&gt;"</span>
<a name="3075" href="#3075">3075</a>                             + HTMLHelper.escapeString(urlString)
<a name="3076" href="#3076">3076</a>                             + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;\n"</span>);
<a name="3077" href="#3077">3077</a> 
<a name="3078" href="#3078">3078</a>                     channelCount++;
<a name="3079" href="#3079">3079</a>                 }
<a name="3080" href="#3080">3080</a> 
<a name="3081" href="#3081">3081</a>                 writer.write(
<a name="3082" href="#3082">3082</a>                     <span class="jxr_string">"&lt;tr&gt;&lt;td align='center' class='row2' colspan='4'&gt;&lt;input type='submit' value='Import Channels'&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="3083" href="#3083">3083</a>                 writer.write(<span class="jxr_string">"&lt;/table&gt;&lt;/form&gt;"</span>);
<a name="3084" href="#3084">3084</a>             } <strong class="jxr_keyword">else</strong> {
<a name="3085" href="#3085">3085</a>                 writer.write(
<a name="3086" href="#3086">3086</a>                     <span class="jxr_string">"Your mySubscriptions.opml file did not contain any channels, or was in an invalid format.&lt;p&gt;"</span>);
<a name="3087" href="#3087">3087</a>             }
<a name="3088" href="#3088">3088</a> 
<a name="3089" href="#3089">3089</a>         } <strong class="jxr_keyword">catch</strong> (SAXException se) {
<a name="3090" href="#3090">3090</a>             errors.add(
<a name="3091" href="#3091">3091</a>                 <span class="jxr_string">"There was an error parsing your channel file:&lt;br&gt;"</span>
<a name="3092" href="#3092">3092</a>                     + se.getMessage());
<a name="3093" href="#3093">3093</a>         } <strong class="jxr_keyword">catch</strong> (ParserConfigurationException pce) {
<a name="3094" href="#3094">3094</a>             errors.add(
<a name="3095" href="#3095">3095</a>                 <span class="jxr_string">"There was a problem reading your channelf file:&lt;br&gt;"</span>
<a name="3096" href="#3096">3096</a>                     + pce.getMessage());
<a name="3097" href="#3097">3097</a>         }
<a name="3098" href="#3098">3098</a> 
<a name="3099" href="#3099">3099</a>         <em class="jxr_comment">// Display any errors encountered during parsing...</em>
<a name="3100" href="#3100">3100</a>         <strong class="jxr_keyword">if</strong> (errors.size() &gt; 0) {
<a name="3101" href="#3101">3101</a>             writer.write(<span class="jxr_string">"Problems were encountered while adding channels.&lt;p&gt;"</span>);
<a name="3102" href="#3102">3102</a>             writeErrors(writer, errors);
<a name="3103" href="#3103">3103</a>         }
<a name="3104" href="#3104">3104</a> 
<a name="3105" href="#3105">3105</a>         writeFooter(writer);
<a name="3106" href="#3106">3106</a>         writer.flush();
<a name="3107" href="#3107">3107</a> 
<a name="3108" href="#3108">3108</a>     }
<a name="3109" href="#3109">3109</a> 
<a name="3110" href="#3110">3110</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdImportOpmlChannelConfig(
<a name="3111" href="#3111">3111</a>         HttpServletRequest request,
<a name="3112" href="#3112">3112</a>         HttpServletResponse response)
<a name="3113" href="#3113">3113</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="3114" href="#3114">3114</a> 
<a name="3115" href="#3115">3115</a>         Writer writer = response.getWriter();
<a name="3116" href="#3116">3116</a>         writeHeader(writer, TAB_CONFIG);
<a name="3117" href="#3117">3117</a> 
<a name="3118" href="#3118">3118</a>         <a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a> channelManager =
<a name="3119" href="#3119">3119</a>             (<a href="../../../../org/methodize/nntprss/feed/ChannelManager.html">ChannelManager</a>) getServletContext().getAttribute(
<a name="3120" href="#3120">3120</a>                 AdminServer.SERVLET_CTX_RSS_MANAGER);
<a name="3121" href="#3121">3121</a> 
<a name="3122" href="#3122">3122</a>         writer.write(<span class="jxr_string">"&lt;b&gt;Import status&lt;/b&gt;&lt;p&gt;"</span>);
<a name="3123" href="#3123">3123</a> 
<a name="3124" href="#3124">3124</a>         List errors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="3125" href="#3125">3125</a>         <strong class="jxr_keyword">int</strong> channelsAdded = 0;
<a name="3126" href="#3126">3126</a> 
<a name="3127" href="#3127">3127</a>         StringBuffer errorContent = <strong class="jxr_keyword">new</strong> StringBuffer();
<a name="3128" href="#3128">3128</a> 
<a name="3129" href="#3129">3129</a>         <strong class="jxr_keyword">int</strong> channelCount = 0;
<a name="3130" href="#3130">3130</a>         <strong class="jxr_keyword">int</strong> newChannelCount = 0;
<a name="3131" href="#3131">3131</a>         String urlString = request.getParameter(<span class="jxr_string">"url"</span> + channelCount);
<a name="3132" href="#3132">3132</a> 
<a name="3133" href="#3133">3133</a>         <strong class="jxr_keyword">while</strong> (urlString != <strong class="jxr_keyword">null</strong>) {
<a name="3134" href="#3134">3134</a> 
<a name="3135" href="#3135">3135</a>             String addStr = request.getParameter(<span class="jxr_string">"import"</span> + channelCount);
<a name="3136" href="#3136">3136</a>             <strong class="jxr_keyword">if</strong> (addStr != <strong class="jxr_keyword">null</strong>) {
<a name="3137" href="#3137">3137</a> 
<a name="3138" href="#3138">3138</a>                 String name = request.getParameter(<span class="jxr_string">"name"</span> + channelCount);
<a name="3139" href="#3139">3139</a> <em class="jxr_comment">//                String historicalStr =</em>
<a name="3140" href="#3140">3140</a> <em class="jxr_comment">//                    request.getParameter("historical" + channelCount);</em>
<a name="3141" href="#3141">3141</a>                 <strong class="jxr_keyword">long</strong> expiration =
<a name="3142" href="#3142">3142</a>                     Long.parseLong(
<a name="3143" href="#3143">3143</a>                         request.getParameter(<span class="jxr_string">"expiration"</span> + channelCount));
<a name="3144" href="#3144">3144</a>                 <em class="jxr_comment">//				boolean historical = false;</em>
<a name="3145" href="#3145">3145</a>                 <em class="jxr_comment">//	// FIXME check</em>
<a name="3146" href="#3146">3146</a>                 <em class="jxr_comment">//				if(historicalStr != null) {</em>
<a name="3147" href="#3147">3147</a>                 <em class="jxr_comment">//					historical = true;</em>
<a name="3148" href="#3148">3148</a>                 <em class="jxr_comment">//				}</em>
<a name="3149" href="#3149">3149</a> 
<a name="3150" href="#3150">3150</a>                 <em class="jxr_comment">// Check name...</em>
<a name="3151" href="#3151">3151</a>                 List currentErrors = <strong class="jxr_keyword">new</strong> ArrayList();
<a name="3152" href="#3152">3152</a>                 <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> existingChannel = channelManager.channelByName(name);
<a name="3153" href="#3153">3153</a> 
<a name="3154" href="#3154">3154</a>                 <strong class="jxr_keyword">if</strong> (name.length() == 0) {
<a name="3155" href="#3155">3155</a>                     currentErrors.add(
<a name="3156" href="#3156">3156</a>                         <span class="jxr_string">"Channel with empty name - URL="</span> + urlString);
<a name="3157" href="#3157">3157</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (name.indexOf(' ') &gt; -1) {
<a name="3158" href="#3158">3158</a>                     currentErrors.add(
<a name="3159" href="#3159">3159</a>                         <span class="jxr_string">"Channel name cannot contain spaces - name="</span> + name);
<a name="3160" href="#3160">3160</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (existingChannel != <strong class="jxr_keyword">null</strong>) {
<a name="3161" href="#3161">3161</a>                     currentErrors.add(
<a name="3162" href="#3162">3162</a>                         <span class="jxr_string">"Channel name "</span> + name + <span class="jxr_string">" is already is use"</span>);
<a name="3163" href="#3163">3163</a>                 }
<a name="3164" href="#3164">3164</a> 
<a name="3165" href="#3165">3165</a>                 <strong class="jxr_keyword">if</strong> (urlString.length() == 0) {
<a name="3166" href="#3166">3166</a>                     currentErrors.add(
<a name="3167" href="#3167">3167</a>                         <span class="jxr_string">"URL cannot be empty, channel name="</span> + name);
<a name="3168" href="#3168">3168</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="3169" href="#3169">3169</a>                     urlString.equals(<span class="jxr_string">"http://"</span>)
<a name="3170" href="#3170">3170</a>                         || urlString.equals(<span class="jxr_string">"https://"</span>)) {
<a name="3171" href="#3171">3171</a>                     currentErrors.add(
<a name="3172" href="#3172">3172</a>                         <span class="jxr_string">"You must specify a URL, channel name="</span> + name);
<a name="3173" href="#3173">3173</a>                 } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (
<a name="3174" href="#3174">3174</a>                     !urlString.startsWith(<span class="jxr_string">"http://"</span>)
<a name="3175" href="#3175">3175</a>                         &amp;&amp; !urlString.startsWith(<span class="jxr_string">"https://"</span>)) {
<a name="3176" href="#3176">3176</a>                     currentErrors.add(
<a name="3177" href="#3177">3177</a>                         <span class="jxr_string">"Only URLs starting http:// or https:// are supported, channel name="</span>
<a name="3178" href="#3178">3178</a>                             + name
<a name="3179" href="#3179">3179</a>                             + <span class="jxr_string">", url="</span>
<a name="3180" href="#3180">3180</a>                             + urlString);
<a name="3181" href="#3181">3181</a>                 }
<a name="3182" href="#3182">3182</a> 
<a name="3183" href="#3183">3183</a>                 <strong class="jxr_keyword">if</strong> (existingChannel == <strong class="jxr_keyword">null</strong>) {
<a name="3184" href="#3184">3184</a> 
<a name="3185" href="#3185">3185</a>                     <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a> newChannel = <strong class="jxr_keyword">null</strong>;
<a name="3186" href="#3186">3186</a>                     <strong class="jxr_keyword">if</strong> (currentErrors.size() == 0) {
<a name="3187" href="#3187">3187</a>                         <strong class="jxr_keyword">try</strong> {
<a name="3188" href="#3188">3188</a>                             newChannel = <strong class="jxr_keyword">new</strong> <a href="../../../../org/methodize/nntprss/feed/Channel.html">Channel</a>(name, urlString);
<a name="3189" href="#3189">3189</a>                             <em class="jxr_comment">//							newChannel.setHistorical(historical);</em>
<a name="3190" href="#3190">3190</a>                             newChannel.setExpiration(expiration);
<a name="3191" href="#3191">3191</a>                             channelManager.addChannel(newChannel);
<a name="3192" href="#3192">3192</a>                             channelsAdded++;
<a name="3193" href="#3193">3193</a>                         } <strong class="jxr_keyword">catch</strong> (MalformedURLException me) {
<a name="3194" href="#3194">3194</a>                             errors.add(
<a name="3195" href="#3195">3195</a>                                 <span class="jxr_string">"Channel "</span>
<a name="3196" href="#3196">3196</a>                                     + name
<a name="3197" href="#3197">3197</a>                                     + <span class="jxr_string">" - URL ("</span>
<a name="3198" href="#3198">3198</a>                                     + urlString
<a name="3199" href="#3199">3199</a>                                     + <span class="jxr_string">") is malformed"</span>);
<a name="3200" href="#3200">3200</a>                         }
<a name="3201" href="#3201">3201</a>                     }
<a name="3202" href="#3202">3202</a> 
<a name="3203" href="#3203">3203</a>                 }
<a name="3204" href="#3204">3204</a> 
<a name="3205" href="#3205">3205</a>                 <strong class="jxr_keyword">if</strong> (currentErrors.size() &gt; 0) {
<a name="3206" href="#3206">3206</a>                     errorContent.append(
<a name="3207" href="#3207">3207</a>                         <span class="jxr_string">"&lt;tr&gt;"</span>
<a name="3208" href="#3208">3208</a>                             + <span class="jxr_string">"&lt;td rowspan='2' align='center'&gt;&lt;input type='checkbox' name='import"</span>
<a name="3209" href="#3209">3209</a>                             + newChannelCount
<a name="3210" href="#3210">3210</a>                             + <span class="jxr_string">"' checked&gt;&lt;/td&gt;"</span>
<a name="3211" href="#3211">3211</a>                             + <span class="jxr_string">"&lt;td&gt;&lt;input type='value' size='50' name='name"</span>
<a name="3212" href="#3212">3212</a>                             + newChannelCount
<a name="3213" href="#3213">3213</a>                             + <span class="jxr_string">"' value='"</span>
<a name="3214" href="#3214">3214</a>                             + HTMLHelper.escapeString(name)
<a name="3215" href="#3215">3215</a>                             + <span class="jxr_string">"'&gt;&lt;/td&gt;"</span>
<a name="3216" href="#3216">3216</a>                             + <span class="jxr_string">"&lt;td align='center'&gt;"</span>
<a name="3217" href="#3217">3217</a>                             + <span class="jxr_string">"&lt;select name='expiration"</span>
<a name="3218" href="#3218">3218</a>                             + newChannelCount
<a name="3219" href="#3219">3219</a>                             + <span class="jxr_string">"'&gt;"</span>);
<a name="3220" href="#3220">3220</a> 
<a name="3221" href="#3221">3221</a>                     writeOption(
<a name="3222" href="#3222">3222</a>                         errorContent,
<a name="3223" href="#3223">3223</a>                         <span class="jxr_string">"Keep all items"</span>,
<a name="3224" href="#3224">3224</a>                         Channel.EXPIRATION_KEEP,
<a name="3225" href="#3225">3225</a>                         expiration);
<a name="3226" href="#3226">3226</a>                     writeOption(
<a name="3227" href="#3227">3227</a>                         errorContent,
<a name="3228" href="#3228">3228</a>                         <span class="jxr_string">"Keep only current items"</span>,
<a name="3229" href="#3229">3229</a>                         0,
<a name="3230" href="#3230">3230</a>                         expiration);
<a name="3231" href="#3231">3231</a>                     writeOption(
<a name="3232" href="#3232">3232</a>                         errorContent,
<a name="3233" href="#3233">3233</a>                         <span class="jxr_string">"Keep items for 1 day"</span>,
<a name="3234" href="#3234">3234</a>                         (1000 * 60 * 60 * 24 * 1),
<a name="3235" href="#3235">3235</a>                         expiration);
<a name="3236" href="#3236">3236</a>                     writeOption(
<a name="3237" href="#3237">3237</a>                         errorContent,
<a name="3238" href="#3238">3238</a>                         <span class="jxr_string">"Keep items for 2 days"</span>,
<a name="3239" href="#3239">3239</a>                         (1000 * 60 * 60 * 24 * 2),
<a name="3240" href="#3240">3240</a>                         expiration);
<a name="3241" href="#3241">3241</a>                     writeOption(
<a name="3242" href="#3242">3242</a>                         errorContent,
<a name="3243" href="#3243">3243</a>                         <span class="jxr_string">"Keep items for 4 days"</span>,
<a name="3244" href="#3244">3244</a>                         (1000 * 60 * 60 * 24 * 4),
<a name="3245" href="#3245">3245</a>                         expiration);
<a name="3246" href="#3246">3246</a>                     writeOption(
<a name="3247" href="#3247">3247</a>                         errorContent,
<a name="3248" href="#3248">3248</a>                         <span class="jxr_string">"Keep items for 1 week"</span>,
<a name="3249" href="#3249">3249</a>                         (1000 * 60 * 60 * 24 * 7),
<a name="3250" href="#3250">3250</a>                         expiration);
<a name="3251" href="#3251">3251</a>                     writeOption(
<a name="3252" href="#3252">3252</a>                         errorContent,
<a name="3253" href="#3253">3253</a>                         <span class="jxr_string">"Keep items for 2 weeks"</span>,
<a name="3254" href="#3254">3254</a>                         (1000 * 60 * 60 * 24 * 14),
<a name="3255" href="#3255">3255</a>                         expiration);
<a name="3256" href="#3256">3256</a>                     writeOption(
<a name="3257" href="#3257">3257</a>                         errorContent,
<a name="3258" href="#3258">3258</a>                         <span class="jxr_string">"Keep items for 4 weeks"</span>,
<a name="3259" href="#3259">3259</a>                         (1000 * 60 * 60 * 24 * 28),
<a name="3260" href="#3260">3260</a>                         expiration);
<a name="3261" href="#3261">3261</a> 
<a name="3262" href="#3262">3262</a>                     errorContent.append(
<a name="3263" href="#3263">3263</a>                         <span class="jxr_string">"&lt;/select&gt;&lt;/td&gt;"</span>
<a name="3264" href="#3264">3264</a>                             + <span class="jxr_string">"&lt;td&gt;&lt;input type='hidden' name='url"</span>
<a name="3265" href="#3265">3265</a>                             + newChannelCount++
<a name="3266" href="#3266">3266</a>                             + <span class="jxr_string">"' value='"</span>
<a name="3267" href="#3267">3267</a>                             + HTMLHelper.escapeString(urlString)
<a name="3268" href="#3268">3268</a>                             + <span class="jxr_string">"'&gt;"</span>
<a name="3269" href="#3269">3269</a>                             + HTMLHelper.escapeString(urlString)
<a name="3270" href="#3270">3270</a>                             + <span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;\n"</span>);
<a name="3271" href="#3271">3271</a>                     errorContent.append(
<a name="3272" href="#3272">3272</a>                         <span class="jxr_string">"&lt;tr&gt;&lt;td colspan='3'&gt;&amp;nbsp;&amp;nbsp;&lt;font color='red'&gt;"</span>);
<a name="3273" href="#3273">3273</a>                     <strong class="jxr_keyword">for</strong> (Iterator i = currentErrors.iterator(); i.hasNext();) {
<a name="3274" href="#3274">3274</a>                         String error = (String) i.next();
<a name="3275" href="#3275">3275</a>                         errorContent.append(error);
<a name="3276" href="#3276">3276</a>                         errorContent.append(<span class="jxr_string">"&lt;br&gt;\n"</span>);
<a name="3277" href="#3277">3277</a>                     }
<a name="3278" href="#3278">3278</a>                     errorContent.append(<span class="jxr_string">"&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;\n"</span>);
<a name="3279" href="#3279">3279</a>                 }
<a name="3280" href="#3280">3280</a>             } <em class="jxr_comment">// end import != null</em>
<a name="3281" href="#3281">3281</a> 
<a name="3282" href="#3282">3282</a>             channelCount++;
<a name="3283" href="#3283">3283</a>             urlString = request.getParameter(<span class="jxr_string">"url"</span> + channelCount);
<a name="3284" href="#3284">3284</a> 
<a name="3285" href="#3285">3285</a>         }
<a name="3286" href="#3286">3286</a> 
<a name="3287" href="#3287">3287</a>         <em class="jxr_comment">// Display any errors encountered during processing...</em>
<a name="3288" href="#3288">3288</a>         <strong class="jxr_keyword">if</strong> (errorContent.length() &gt; 0) {
<a name="3289" href="#3289">3289</a>             <strong class="jxr_keyword">if</strong> (channelsAdded &gt; 0) {
<a name="3290" href="#3290">3290</a>                 writer.write(
<a name="3291" href="#3291">3291</a>                     <span class="jxr_string">"&lt;p&gt;"</span>
<a name="3292" href="#3292">3292</a>                         + channelsAdded
<a name="3293" href="#3293">3293</a>                         + <span class="jxr_string">" channel(s) were successfully imported."</span>);
<a name="3294" href="#3294">3294</a>             }
<a name="3295" href="#3295">3295</a> 
<a name="3296" href="#3296">3296</a>             writeCheckboxSelector(
<a name="3297" href="#3297">3297</a>                 writer,
<a name="3298" href="#3298">3298</a>                 <span class="jxr_string">"checkAllImport"</span>,
<a name="3299" href="#3299">3299</a>                 <span class="jxr_string">"import"</span>,
<a name="3300" href="#3300">3300</a>                 <span class="jxr_string">"channels"</span>);
<a name="3301" href="#3301">3301</a> 
<a name="3302" href="#3302">3302</a>             writer.write(<span class="jxr_string">"Problems were encountered while adding channels.&lt;p&gt;"</span>);
<a name="3303" href="#3303">3303</a>             writer.write(
<a name="3304" href="#3304">3304</a>                 <span class="jxr_string">"&lt;form name='channels' action='?action=importopml' method='POST'&gt;"</span>);
<a name="3305" href="#3305">3305</a>             writer.write(
<a name="3306" href="#3306">3306</a>                 <span class="jxr_string">"&lt;table border='1'&gt;&lt;tr&gt;&lt;th&gt;Import&lt;br&gt;"</span>
<a name="3307" href="#3307">3307</a>                     + <span class="jxr_string">"&lt;input type='checkbox' name='changeImport' onClick='checkAllImport(this);' checked&gt;"</span>
<a name="3308" href="#3308">3308</a>                     + <span class="jxr_string">"&lt;/th&gt;&lt;th&gt;Channel Name&lt;/th&gt;&lt;th&gt;Expiration"</span>
<a name="3309" href="#3309">3309</a>                     + <span class="jxr_string">"&lt;/th&gt;&lt;th&gt;URL&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3310" href="#3310">3310</a>             writer.write(errorContent.toString());
<a name="3311" href="#3311">3311</a>             writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="3312" href="#3312">3312</a>             writer.write(
<a name="3313" href="#3313">3313</a>                 <span class="jxr_string">"&lt;br&gt;&lt;input type='submit' value='Import Channels'&gt;&lt;/form&gt;"</span>);
<a name="3314" href="#3314">3314</a> 
<a name="3315" href="#3315">3315</a>         } <strong class="jxr_keyword">else</strong> {
<a name="3316" href="#3316">3316</a>             <strong class="jxr_keyword">if</strong> (channelsAdded &gt; 0) {
<a name="3317" href="#3317">3317</a>                 writer.write(
<a name="3318" href="#3318">3318</a>                     <span class="jxr_string">"&lt;p&gt;"</span>
<a name="3319" href="#3319">3319</a>                         + channelsAdded
<a name="3320" href="#3320">3320</a>                         + <span class="jxr_string">" channel(s) were successfully imported."</span>);
<a name="3321" href="#3321">3321</a>             } <strong class="jxr_keyword">else</strong> {
<a name="3322" href="#3322">3322</a>                 writer.write(<span class="jxr_string">"No channels were selected for import!"</span>);
<a name="3323" href="#3323">3323</a>             }
<a name="3324" href="#3324">3324</a>         }
<a name="3325" href="#3325">3325</a> 
<a name="3326" href="#3326">3326</a>         writeFooter(writer);
<a name="3327" href="#3327">3327</a>         writer.flush();
<a name="3328" href="#3328">3328</a> 
<a name="3329" href="#3329">3329</a>     }
<a name="3330" href="#3330">3330</a> 
<a name="3331" href="#3331">3331</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> cmdHelp(
<a name="3332" href="#3332">3332</a>         HttpServletResponse response)
<a name="3333" href="#3333">3333</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="3334" href="#3334">3334</a> 
<a name="3335" href="#3335">3335</a>         Writer writer = response.getWriter();
<a name="3336" href="#3336">3336</a>         writeHeader(writer, TAB_HELP);
<a name="3337" href="#3337">3337</a> 
<a name="3338" href="#3338">3338</a>         writer.write(<span class="jxr_string">"&lt;table class='tableborder' border='0' width='80%'&gt;"</span>);
<a name="3339" href="#3339">3339</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th class='tableHead'&gt;Help&lt;/td&gt;&lt;/th&gt;"</span>);
<a name="3340" href="#3340">3340</a> 
<a name="3341" href="#3341">3341</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;Latest News&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3342" href="#3342">3342</a>         writer.write(
<a name="3343" href="#3343">3343</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td&gt;&lt;br&gt;The latest nntp//rss project news can always be found on the &lt;a href='http://www.methodize.org/nntprss'&gt;nntp//rss project page&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="3344" href="#3344">3344</a> 
<a name="3345" href="#3345">3345</a>         writer.write(
<a name="3346" href="#3346">3346</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;Using the Administration Interface&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3347" href="#3347">3347</a>         writer.write(
<a name="3348" href="#3348">3348</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td&gt;"</span>
<a name="3349" href="#3349">3349</a>                 + <span class="jxr_string">"&lt;br&gt;&lt;b&gt;Add Channel&lt;/b&gt;&lt;/p&gt;"</span>
<a name="3350" href="#3350">3350</a>                 + <span class="jxr_string">"Channels can be added to nntp//rss through this screen.&lt;p&gt;&lt;ul&gt;"</span>
<a name="3351" href="#3351">3351</a>                 + <span class="jxr_string">"&lt;li&gt;Newsgroup name - name of the NNTP newsgroup that this feed will appear as in your newsreader"</span>
<a name="3352" href="#3352">3352</a>                 + <span class="jxr_string">"&lt;li&gt;URL - URL for the feed"</span>
<a name="3353" href="#3353">3353</a>                 + <span class="jxr_string">"&lt;li&gt;Historical - keep items once they have been removed from the original feed"</span>
<a name="3354" href="#3354">3354</a>                 + <span class="jxr_string">"&lt;li&gt;Validate - check the URL to a validate the feed when adding to the list of channels.  You may want to disable this validation if the remote feed is temporarily unavailable, but you still wish to add it to the list."</span>
<a name="3355" href="#3355">3355</a>                 + <span class="jxr_string">"&lt;/ul&gt;"</span>
<a name="3356" href="#3356">3356</a>                 + <span class="jxr_string">"&lt;p&gt;&lt;b&gt;View Channels&lt;/b&gt;&lt;p&gt;"</span>
<a name="3357" href="#3357">3357</a>                 + <span class="jxr_string">"This screen provides an overview of configured channels, their status, and the date and time of the last poll.&lt;p&gt;"</span>
<a name="3358" href="#3358">3358</a>                 + <span class="jxr_string">"Channel Status&lt;p&gt;"</span>
<a name="3359" href="#3359">3359</a>                 + <span class="jxr_string">"&lt;table border='0'&gt;"</span>
<a name="3360" href="#3360">3360</a>                 + <span class="jxr_string">"&lt;tr&gt;&lt;td class='row1'&gt;&lt;b&gt;OK&lt;/b&gt;&lt;/td&gt;&lt;td class='row2'&gt;Last poll was successful.&lt;/td&gt;&lt;/tr&gt;"</span>
<a name="3361" href="#3361">3361</a>                 + <span class="jxr_string">"&lt;tr&gt;&lt;td class='chldisabled'&gt;&lt;b&gt;Disabled&lt;/b&gt;&lt;/td&gt;&lt;td class='row2'&gt;Channel has been disabled.&lt;/td&gt;&lt;/tr&gt;"</span>
<a name="3362" href="#3362">3362</a>                 + <span class="jxr_string">"&lt;tr&gt;&lt;td class='chlwarning'&gt;&lt;b&gt;Warning&lt;/b&gt;&lt;/td&gt;&lt;td class='row2'&gt;nntp//rss is was unable to contact the channel's web server on the last poll.  This usually indicates an temporary problem, generally resolved on the next poll.&lt;/td&gt;&lt;/tr&gt;"</span>
<a name="3363" href="#3363">3363</a>                 + <span class="jxr_string">"&lt;tr&gt;&lt;td class='chlerror'&gt;&lt;b&gt;Error&lt;/b&gt;&lt;/td&gt;&lt;td class='row2'&gt;A significant error occured when polling.  This may either be that the feed no longer exists, or that it is badly formatted.  In the case of the latter, enabling &lt;i&gt;Parse-at-all-cost&lt;/i&gt; within the channel's configuration may provide a resolution&lt;/td&gt;&lt;/tr&gt;"</span>
<a name="3364" href="#3364">3364</a>                 + <span class="jxr_string">"&lt;/table&gt;&lt;p&gt;"</span>
<a name="3365" href="#3365">3365</a>                 + <span class="jxr_string">"Clicking on the name of a channel will display the channel's configuration screen.&lt;p&gt;"</span>
<a name="3366" href="#3366">3366</a>                 + <span class="jxr_string">"Clicking on the [Read] button will open the channel in your default newsreader.&lt;p&gt;"</span>
<a name="3367" href="#3367">3367</a>                 + <span class="jxr_string">"&lt;b&gt;Channel Configuration&lt;/b&gt;&lt;p&gt;"</span>
<a name="3368" href="#3368">3368</a>                 + <span class="jxr_string">"Within this screen you can:"</span>
<a name="3369" href="#3369">3369</a>                 + <span class="jxr_string">"&lt;ul&gt;&lt;li&gt;Modify the URL for the channel,"</span>
<a name="3370" href="#3370">3370</a>                 + <span class="jxr_string">"&lt;li&gt;Enable or disable polling of the channel,"</span>
<a name="3371" href="#3371">3371</a>                 + <span class="jxr_string">"&lt;li&gt;Set a channel-specific polling interval, or use the system wide default (set in &lt;i&gt;System Configuration&lt;/i&gt;),"</span>
<a name="3372" href="#3372">3372</a>                 + <span class="jxr_string">"&lt;li&gt;Enable the Parse-at-all-cost parser.  This experimental parser will parse RSS feeds that are not well-formed XML,"</span>
<a name="3373" href="#3373">3373</a>                 + <span class="jxr_string">"&lt;li&gt;Change the historical status of the channel.  If a channel is 'historical', items that are removed from the feed will be kept within nntp//rss's database,"</span>
<a name="3374" href="#3374">3374</a>                 + <span class="jxr_string">"&lt;li&gt;Enabled posting (See below)."</span>
<a name="3375" href="#3375">3375</a>                 + <span class="jxr_string">"&lt;/ul&gt;"</span>
<a name="3376" href="#3376">3376</a>                 + <span class="jxr_string">"&lt;p&gt;&lt;b&gt;Posting&lt;/b&gt;&lt;p&gt;"</span>
<a name="3377" href="#3377">3377</a>                 + <span class="jxr_string">"nntp//rss supports the &lt;a href='http://plant.blogger.com/api/index.html'&gt;Blogger&lt;/a&gt;, &lt;a href='http://www.xmlrpc.com/metaWeblogApi'&gt;MetaWeblog&lt;/a&gt; and &lt;a href='http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.protocol.html'&gt;LiveJournal&lt;/a&gt; APIs, allow you to publish directly to your blog from within your NNTP newsreader.  Just configure your blog's nntp//rss channel for posting, then use your newsreader's native posting capability to post to the group.  Your post will be immediately sent to your blog's host for publication.&lt;p&gt;"</span>
<a name="3378" href="#3378">3378</a>                 + <span class="jxr_string">"Posting is configured within the channel's configuration screen.  Enabling posting on a channel will display an additional set of configuration fields.  With these fields you provide the information required by your blog's publishing API.&lt;p&gt;"</span>
<a name="3379" href="#3379">3379</a>                 + <span class="jxr_string">"&lt;b&gt;Note: It is recommended that you enable &lt;a href='#SecureNNTP'&gt;Authenticated NNTP Access&lt;/a&gt; if you enable posting.  This will ensure that only an authenticated newsreader will be able to post to the blog.&lt;/b&gt;"</span>
<a name="3380" href="#3380">3380</a>                 + <span class="jxr_string">"&lt;p&gt;&lt;b&gt;System Configuration&lt;/b&gt;&lt;p&gt;"</span>
<a name="3381" href="#3381">3381</a>                 + <span class="jxr_string">"System wide configuration is managed on this screen.&lt;p&gt;"</span>
<a name="3382" href="#3382">3382</a>                 + <span class="jxr_string">"&lt;i&gt;Channel Polling Interval&lt;/i&gt; - this determines how often nntp//rss will check feeds for updates.  This can be set as low as ten minutes, but sixty minutes should be sufficient for most feeds.&lt;p&gt;"</span>
<a name="3383" href="#3383">3383</a>                 + <span class="jxr_string">"&lt;i&gt;Content Type&lt;/i&gt; - By default, nntp//rss serves messages to newsreaders in a combined (multipart/alternative) plain text and HTML MIME format.  This means that each message contains both a plain text and an HTML version of the item.  If you a using an older newsreader that does not support this mode, you may want to change the content type to Text (text/plain).&lt;p&gt;"</span>
<a name="3384" href="#3384">3384</a>                 + <span class="jxr_string">"&lt;i&gt;Proxy&lt;/i&gt; - If you are running nntp//rss behind a proxy, you may need to configure your proxy settings here.  Proxy host name, port and an optional username and password can be specified.  Leave these fields blank if you are not behind a proxy.&lt;p&gt;"</span>
<a name="3385" href="#3385">3385</a>                 + <span class="jxr_string">"&lt;i&gt;&lt;a name='SecureNNTP'&gt;Authenticated NNTP Access&lt;/a&gt;&lt;/i&gt;, when enabled, will require NNTP newsreaders to authenticate themselves before being allowed to read or post.  This uses the same user information as used for securing the web interface.&lt;p&gt;"</span>
<a name="3386" href="#3386">3386</a>                 + <span class="jxr_string">"Import and Export of Channel Lists&lt;p&gt;"</span>
<a name="3387" href="#3387">3387</a>                 + <span class="jxr_string">"nntp//rss supports the import and export of channel lists.  For import, both nntp//rss and OPML (mySubscription.opml) format lists are supported.  Click on &lt;i&gt;Import Channel List&lt;/i&gt;, select the file containing the subscription list, ensuring the correct type of file is checked, then click on the &lt;i&gt;Import&lt;/i&gt; button.  For OPML files, nntp//rss will automatically generate a newsgroup name.  You will be able to modify these names, and also select the subset of channels to import, before the process is finalized.&lt;p&gt;"</span>);
<a name="3388" href="#3388">3388</a> 
<a name="3389" href="#3389">3389</a>         writer.write(
<a name="3390" href="#3390">3390</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;Securing access to nntp//rss&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3391" href="#3391">3391</a> 
<a name="3392" href="#3392">3392</a>         writer.write(
<a name="3393" href="#3393">3393</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td&gt;&lt;br&gt;Access to the web admin interface can be password protected by creating a file named users.properties in the root directory of your nntp//rss installation.&lt;p&gt;"</span>
<a name="3394" href="#3394">3394</a>                 + <span class="jxr_string">"This file takes the form:&lt;p&gt;&lt;code&gt;username:password&lt;/code&gt;&lt;p&gt;e.g. sample user.properties&lt;p&gt;&lt;code&gt;jason:mypassword&lt;/code&gt;&lt;p&gt;"</span>
<a name="3395" href="#3395">3395</a>                 + <span class="jxr_string">"Multiple users can be configured by adding additional lines of usernames and passwords in the above format.&lt;p&gt;"</span>
<a name="3396" href="#3396">3396</a>                 + <span class="jxr_string">"You will need to stop and restart nntp//rss for these changes to take effect.  The next time you access the web interface, you will be prompted to enter your user name and password.&lt;p&gt;"</span>
<a name="3397" href="#3397">3397</a>                 + <span class="jxr_string">"To disable secure access, just delete or rename the users.properties file, and stop and restart nntp//rss.&lt;p&gt;"</span>
<a name="3398" href="#3398">3398</a>                 + <span class="jxr_string">"If you wish to secure access to the NNTP interface, just enable &lt;i&gt;Secure NNTP&lt;/i&gt; within the System Configuration screen.&lt;br&gt;&lt;p&gt;&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="3399" href="#3399">3399</a> 
<a name="3400" href="#3400">3400</a>         writer.write(<span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;Windows Users&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3401" href="#3401">3401</a> 
<a name="3402" href="#3402">3402</a>         writer.write(
<a name="3403" href="#3403">3403</a>             <span class="jxr_string">"&lt;tr&gt;&lt;td&gt;&lt;br&gt;Read the &lt;a href='http://www.methodize.org/nntprss/docs/WINDOWS-SERVICE.TXT'&gt;WINDOWS-SERVICE.TXT&lt;/a&gt; file, located in the installation directory, for information on how to configure nntp//rss to run as a Windows service.&lt;p&gt;"</span>
<a name="3404" href="#3404">3404</a>                 + <span class="jxr_string">"nntp//rss has a System Tray icon when run interactively on Windows.  This provides quick access to the administration interface, as well as the ability to easily shut-down nntp//rss.  "</span>
<a name="3405" href="#3405">3405</a>                 + <span class="jxr_string">"Just right click on the 'N' icon, and choose your option.  You can also double click on the icon to bring up the administrative interface.&lt;p&gt;"</span>);
<a name="3406" href="#3406">3406</a> 
<a name="3407" href="#3407">3407</a>         writer.write(<span class="jxr_string">"&lt;/td&gt;&lt;/tr&gt;"</span>);
<a name="3408" href="#3408">3408</a> 
<a name="3409" href="#3409">3409</a>         writer.write(
<a name="3410" href="#3410">3410</a>             <span class="jxr_string">"&lt;tr&gt;&lt;th class='subHead'&gt;&lt;span class='smalltext'&gt;nntp//rss - Copyright &amp;copy; 2002-2007 Jason Brome.  All Rights Reserved.&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;"</span>);
<a name="3411" href="#3411">3411</a> 
<a name="3412" href="#3412">3412</a>         writer.write(<span class="jxr_string">"&lt;/table&gt;"</span>);
<a name="3413" href="#3413">3413</a> 
<a name="3414" href="#3414">3414</a>         writeFooter(writer);
<a name="3415" href="#3415">3415</a>         writer.flush();
<a name="3416" href="#3416">3416</a>     }
<a name="3417" href="#3417">3417</a> 
<a name="3418" href="#3418">3418</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> processRequest(
<a name="3419" href="#3419">3419</a>         HttpServletRequest request,
<a name="3420" href="#3420">3420</a>         HttpServletResponse response)
<a name="3421" href="#3421">3421</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="3422" href="#3422">3422</a> 
<a name="3423" href="#3423">3423</a>         response.setContentType(<span class="jxr_string">"text/html"</span>);
<a name="3424" href="#3424">3424</a> 
<a name="3425" href="#3425">3425</a>         <a href="../../../../org/methodize/nntprss/admin/AdminServer.html">AdminServer</a> adminServer =
<a name="3426" href="#3426">3426</a>             (<a href="../../../../org/methodize/nntprss/admin/AdminServer.html">AdminServer</a>) getServletContext().getAttribute(
<a name="3427" href="#3427">3427</a>                 AdminServer.SERVLET_CTX_ADMIN_SERVER);
<a name="3428" href="#3428">3428</a> 
<a name="3429" href="#3429">3429</a>         <strong class="jxr_keyword">if</strong> (request.getServerPort() == adminServer.getPort()) {
<a name="3430" href="#3430">3430</a>             String action = request.getParameter(<span class="jxr_string">"action"</span>);
<a name="3431" href="#3431">3431</a>             <strong class="jxr_keyword">if</strong> (action == <strong class="jxr_keyword">null</strong> || action.length() == 0) {
<a name="3432" href="#3432">3432</a>                 cmdShowCurrentChannels(response);
<a name="3433" href="#3433">3433</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"add"</span>)) {
<a name="3434" href="#3434">3434</a>                 cmdAddChannel(request, response);
<a name="3435" href="#3435">3435</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"addcategory"</span>)) {
<a name="3436" href="#3436">3436</a>                 cmdAddCategory(request, response);
<a name="3437" href="#3437">3437</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"addform"</span>)) {
<a name="3438" href="#3438">3438</a>                 cmdAddChannelForm(request, response);
<a name="3439" href="#3439">3439</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"addcategoryform"</span>)) {
<a name="3440" href="#3440">3440</a>                 cmdAddCategoryForm(response);
<a name="3441" href="#3441">3441</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"showconfig"</span>)) {
<a name="3442" href="#3442">3442</a>                 cmdShowConfig(response);
<a name="3443" href="#3443">3443</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"updateconfig"</span>)) {
<a name="3444" href="#3444">3444</a>                 cmdUpdateConfig(request, response);
<a name="3445" href="#3445">3445</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"show"</span>)) {
<a name="3446" href="#3446">3446</a>                 cmdShowChannel(request, response);
<a name="3447" href="#3447">3447</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"showcategory"</span>)) {
<a name="3448" href="#3448">3448</a>                 cmdShowCategory(request, response);
<a name="3449" href="#3449">3449</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"update"</span>)) {
<a name="3450" href="#3450">3450</a>                 cmdUpdateChannel(request, response);
<a name="3451" href="#3451">3451</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"categoryupdate"</span>)) {
<a name="3452" href="#3452">3452</a>                 cmdUpdateCategory(request, response);
<a name="3453" href="#3453">3453</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"export"</span>)) {
<a name="3454" href="#3454">3454</a>                 cmdExportChannelConfig(response);
<a name="3455" href="#3455">3455</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"exportopml"</span>)) {
<a name="3456" href="#3456">3456</a>                 cmdExportOpmlChannelConfig(response);
<a name="3457" href="#3457">3457</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"import"</span>)) {
<a name="3458" href="#3458">3458</a>                 cmdImportChannelConfig(request, response);
<a name="3459" href="#3459">3459</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"importform"</span>)) {
<a name="3460" href="#3460">3460</a>                 cmdImportChannelConfigForm(response);
<a name="3461" href="#3461">3461</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"importopml"</span>)) {
<a name="3462" href="#3462">3462</a>                 cmdImportOpmlChannelConfig(request, response);
<a name="3463" href="#3463">3463</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"channelaction"</span>)) {
<a name="3464" href="#3464">3464</a>                 cmdChannelAction(request, response);
<a name="3465" href="#3465">3465</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"editchlrefresh"</span>)) {
<a name="3466" href="#3466">3466</a>                 cmdEditChannelRefresh(request, response);
<a name="3467" href="#3467">3467</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"quickedit"</span>)) {
<a name="3468" href="#3468">3468</a>                 cmdQuickEditChannels(response, false);
<a name="3469" href="#3469">3469</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"quickeditupdate"</span>)) {
<a name="3470" href="#3470">3470</a>                 cmdQuickEditChannelsUpdate(request, response);
<a name="3471" href="#3471">3471</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"help"</span>)) {
<a name="3472" href="#3472">3472</a>                 cmdHelp(response);
<a name="3473" href="#3473">3473</a>             } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (action.equals(<span class="jxr_string">"categories"</span>)) {
<a name="3474" href="#3474">3474</a>                 cmdShowCurrentCategories(response);
<a name="3475" href="#3475">3475</a>             } <strong class="jxr_keyword">else</strong> {
<a name="3476" href="#3476">3476</a>                 cmdShowCurrentChannels(response);
<a name="3477" href="#3477">3477</a>             }
<a name="3478" href="#3478">3478</a>         } <strong class="jxr_keyword">else</strong> {
<a name="3479" href="#3479">3479</a>             <em class="jxr_comment">// Must be a subscription listener...</em>
<a name="3480" href="#3480">3480</a>             List subListeners =
<a name="3481" href="#3481">3481</a>                 (List) adminServer.getSubscriptionListeners().get(
<a name="3482" href="#3482">3482</a>                     <strong class="jxr_keyword">new</strong> Integer(request.getServerPort()));
<a name="3483" href="#3483">3483</a>             String url = <strong class="jxr_keyword">null</strong>;
<a name="3484" href="#3484">3484</a>             <strong class="jxr_keyword">if</strong> (subListeners != <strong class="jxr_keyword">null</strong>) {
<a name="3485" href="#3485">3485</a>                 <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; subListeners.size(); i++) {
<a name="3486" href="#3486">3486</a>                     <a href="../../../../org/methodize/nntprss/admin/SubscriptionListener.html">SubscriptionListener</a> subListener =
<a name="3487" href="#3487">3487</a>                         (<a href="../../../../org/methodize/nntprss/admin/SubscriptionListener.html">SubscriptionListener</a>) subListeners.get(i);
<a name="3488" href="#3488">3488</a>                     <strong class="jxr_keyword">if</strong> (request.getPathInfo().equals(subListener.getPath())) {
<a name="3489" href="#3489">3489</a>                         url = request.getParameter(subListener.getParam());
<a name="3490" href="#3490">3490</a>                         <strong class="jxr_keyword">break</strong>;
<a name="3491" href="#3491">3491</a>                     }
<a name="3492" href="#3492">3492</a>                 }
<a name="3493" href="#3493">3493</a>             }
<a name="3494" href="#3494">3494</a> 
<a name="3495" href="#3495">3495</a>             <strong class="jxr_keyword">if</strong> (url != <strong class="jxr_keyword">null</strong>) {
<a name="3496" href="#3496">3496</a>                 <em class="jxr_comment">// Generate HTML redirect, as sendRedirect does not seem to function</em>
<a name="3497" href="#3497">3497</a>                 <em class="jxr_comment">// @TODO: Investigate behavior...</em>
<a name="3498" href="#3498">3498</a>                 Writer out = response.getWriter();
<a name="3499" href="#3499">3499</a>                 String destinationURL =
<a name="3500" href="#3500">3500</a>                     <strong class="jxr_keyword">new</strong> URL(
<a name="3501" href="#3501">3501</a>                         <span class="jxr_string">"http"</span>,
<a name="3502" href="#3502">3502</a>                         request.getServerName(),
<a name="3503" href="#3503">3503</a>                         adminServer.getPort(),
<a name="3504" href="#3504">3504</a>                         <span class="jxr_string">"/?action=addform&amp;URL="</span> + URLEncoder.encode(url))
<a name="3505" href="#3505">3505</a>                         .toString();
<a name="3506" href="#3506">3506</a>                 out.write(<span class="jxr_string">"&lt;html&gt;&lt;head&gt;"</span>);
<a name="3507" href="#3507">3507</a>                 out.write(
<a name="3508" href="#3508">3508</a>                     <span class="jxr_string">"&lt;META HTTP-EQUIV='Refresh' Content='0; URL="</span>
<a name="3509" href="#3509">3509</a>                         + destinationURL
<a name="3510" href="#3510">3510</a>                         + <span class="jxr_string">"'&gt;"</span>);
<a name="3511" href="#3511">3511</a>                 out.write(
<a name="3512" href="#3512">3512</a>                     <span class="jxr_string">"&lt;/head&gt;&lt;body&gt;&lt;a href='"</span>
<a name="3513" href="#3513">3513</a>                         + destinationURL
<a name="3514" href="#3514">3514</a>                         + <span class="jxr_string">"'&gt;Redirecting to nntp//rss admin...&lt;/a&gt;&lt;/html&gt;"</span>);
<a name="3515" href="#3515">3515</a>                 <em class="jxr_comment">//				response.sendRedirect(new URL("http", request.getServerName(), adminServer.getPort(), "/?action=addform&amp;URL=" + URLEncoder.encode(url)).toString()); </em>
<a name="3516" href="#3516">3516</a>             } <strong class="jxr_keyword">else</strong> {
<a name="3517" href="#3517">3517</a>                 response.sendRedirect(
<a name="3518" href="#3518">3518</a>                     <strong class="jxr_keyword">new</strong> URL(
<a name="3519" href="#3519">3519</a>                         <span class="jxr_string">"http"</span>,
<a name="3520" href="#3520">3520</a>                         request.getServerName(),
<a name="3521" href="#3521">3521</a>                         adminServer.getPort(),
<a name="3522" href="#3522">3522</a>                         <span class="jxr_string">"/"</span>)
<a name="3523" href="#3523">3523</a>                         .toString());
<a name="3524" href="#3524">3524</a>             }
<a name="3525" href="#3525">3525</a>         }
<a name="3526" href="#3526">3526</a>     }
<a name="3527" href="#3527">3527</a> 
<a name="3528" href="#3528">3528</a>     <em class="jxr_javadoccomment">/**</em>
<a name="3529" href="#3529">3529</a> <em class="jxr_javadoccomment">     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, HttpServletResponse)</em>
<a name="3530" href="#3530">3530</a> <em class="jxr_javadoccomment">     */</em>
<a name="3531" href="#3531">3531</a>     <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">void</strong> doGet(
<a name="3532" href="#3532">3532</a>         HttpServletRequest request,
<a name="3533" href="#3533">3533</a>         HttpServletResponse response)
<a name="3534" href="#3534">3534</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="3535" href="#3535">3535</a> 
<a name="3536" href="#3536">3536</a>         processRequest(request, response);
<a name="3537" href="#3537">3537</a>     }
<a name="3538" href="#3538">3538</a> 
<a name="3539" href="#3539">3539</a>     <em class="jxr_javadoccomment">/**</em>
<a name="3540" href="#3540">3540</a> <em class="jxr_javadoccomment">     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest, HttpServletResponse)</em>
<a name="3541" href="#3541">3541</a> <em class="jxr_javadoccomment">     */</em>
<a name="3542" href="#3542">3542</a>     <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">void</strong> doPost(
<a name="3543" href="#3543">3543</a>         HttpServletRequest request,
<a name="3544" href="#3544">3544</a>         HttpServletResponse response)
<a name="3545" href="#3545">3545</a>         <strong class="jxr_keyword">throws</strong> ServletException, IOException {
<a name="3546" href="#3546">3546</a> 
<a name="3547" href="#3547">3547</a>         processRequest(request, response);
<a name="3548" href="#3548">3548</a>     }
<a name="3549" href="#3549">3549</a> 
<a name="3550" href="#3550">3550</a> }
</pre>
<hr/><div id="footer">This page was automatically generated by <a href="http://maven.apache.org/">Maven</a></div></body>
</html>

